home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / mus / play / DelfMPEG.lha / DelfMPEG / src / MP3.a56 < prev    next >
Text File  |  2002-10-30  |  86KB  |  2,771 lines

  1. ;*****************************************************************************
  2. ;
  3. ;    DelfMPEG - MPEG audio player for Delfina DSP
  4. ;    Copyright (C) 1999-2002  Michael Henke
  5. ;
  6. ;    This program is free software; you can redistribute it and/or modify
  7. ;    it under the terms of the GNU General Public License as published by
  8. ;    the Free Software Foundation; either version 2 of the License, or
  9. ;    (at your option) any later version.
  10. ;
  11. ;    This program is distributed in the hope that it will be useful,
  12. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ;    GNU General Public License for more details.
  15. ;
  16. ;    You should have received a copy of the GNU General Public License
  17. ;    along with this program; if not, write to the Free Software
  18. ;    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19. ;
  20. ;*****************************************************************************
  21.  
  22.  
  23.  
  24. ;Delfina object DSP56K_MP3
  25. ;memory map (for Amiga access)
  26. ;
  27. ; prog
  28. ;    0 .. init
  29. ;   +2 .. decode frame
  30. ;
  31. ; xdata
  32. ;+2048 .. inbuf (framedata: +0..side info, +11 words..main_data)
  33. ;
  34. ; ydata
  35. ;  +16 .. busy (Amiga read only, TRUE (NON-ZERO) if decoder is running)
  36. ;  +17 .. forcemono (Amiga write)
  37. ;  +18 .. pow43tab (8206 words; precalculated by main prog)
  38. ;
  39.     include 'delfequ.inc'
  40.  
  41.     org    p:
  42. ;->prog
  43.     jmp    init
  44. ;->prog+2
  45.  
  46.  
  47.  
  48. ;*****************************************************************************
  49. ;
  50. ; **** MPEG1 layer III frame decoder ****
  51. ;
  52. ; parameters
  53. ;  x1 - mono          (mono: non_zero, stereo: zero)
  54. ;  x0 - output buffer (1152 words in L-mem)
  55. ;  y1 - modext        (from frame header: mode extension)
  56. ;  y0 - /
  57. ;
  58. ;
  59. ; uses ideas/code from:
  60. ;   - MPEG Audio Layer II decoder by Fredrik Noring and Tomas Berndtsson
  61. ;     (an mp2 player for Atari Falcon, DSP56K code)
  62. ;   - amp11 by Niklas Beisert (clean and fast C++ code)
  63. ;   - FalcAMP by Denis "STGhost" Huguet and David "Splash" Carrere
  64. ;     (an mp3 player for Atari Falcon, DSP56K code)
  65. ;   - reference code by MPEG Software Simulation Group ("the original" C code)
  66. ;
  67. ; Delfina DSP programming by Smack/Infect!
  68. ;
  69. ;
  70. ; (Sun 09-Apr-2000) - finally: it's working!!
  71. ;                     (but INTENSITY STEREO decoding is not implemented yet)
  72. ; (Wed 26-Apr-2000) - optimized synthesis and hybrid filter routines
  73. ; (Sat 29-Apr-2000) - optimized huffman decoding routines
  74. ; (Tue 16-May-2000) - started implementing INTENSITY STEREO support
  75. ;                     but it's not working yet (temporarily removed)
  76. ; (Sun 16-Jul-2000) - optimized a little (tiny speedup only)
  77. ; (Sun 01-Apr-2001) - fixed stupid bug which had caused minor distortions
  78. ; (Sat 07-Apr-2001) - implemented INTENSITY STEREO decoding (at last)
  79. ; (Wed 10-Oct-2001) - huffman decoding tiny speedup (now it's getting tricky)
  80. ; (Thu 24-Oct-2002) - synthesis: corrected output level
  81. ;                   - huffman/scaling: reorder short blocks only (less memory)
  82. ;                   - scaling: skip zero scalefactor bands (tiny speedup)
  83. ;
  84. ;*****************************************************************************
  85.  
  86.     move    x1,x:mono
  87.     move    x0,x:outbuf
  88.     clr    b    y1,x:modext
  89.     tfr    x1,a    #<1,b1
  90.     tst    a    #<2,a1
  91.     tne    b,a
  92.     move    a1,x:channels
  93.     move    a1,y:busy        ;set BUSY to non-zero
  94.  
  95.     move    #>inbuf,r7
  96.     jsr    getbits_init
  97.  
  98. ; WARNING:
  99. ; the active 'getbits' routine occupies these registers: r5, r6, r7, b
  100. ; (their contents must not be changed!!)
  101. ;
  102. ; 'getbits' is used in the bitstream processing routines:
  103. ; * get side info
  104. ; * read scalefactors
  105. ; * read huffman
  106. ;
  107. ; this register limitation does not exist in the other parts of the decoder
  108.  
  109.  
  110.  
  111. ;*****************************************************************************
  112. ;*** get side info
  113. ;*****************************************************************************
  114.     clr    a    #<9,n7
  115.     jsr    (r5)            ;getbits(9) - main_data_begin
  116.  
  117.     move    x:mono,a
  118.     move    #>5,x0
  119.     tst    a    #<3,a1
  120.     tne    x0,a
  121.     clr    a    a1,n7
  122.     jsr    (r5)            ;getbits(mono?5:3) - private_bits
  123.  
  124. ;****** read scalefactor selection info
  125.     move    x:mono,a
  126.     move    #>4,x0
  127.     tst    a    #<8,a1
  128.     tne    x0,a            ;loops=mono?4:8
  129.     move    #>granule1_sfsi,r0
  130.     do    a1,read_sfsi
  131.     jsr    (r6)            ;getbit1
  132.     move    a,x:(r0)+
  133. read_sfsi
  134.  
  135. ;****** read granule side info
  136.     move    #>si_tab,r3        ;first granule
  137.     move    x:channels,n3
  138.     move    #<0,y1            ;y1=bitpos
  139.     move    #<0,x1            ;x1=granule_counter
  140.  
  141. read_grsi_loop_head
  142.     do    n3,read_grsi_loop    ;channels
  143.     move    x:(r3)+,r0        ;r0=pointer to si_struct
  144.  
  145.     clr    a    #<12,n7
  146.     jsr    (r5)            ;getbits(12)
  147.     add    y1,a    y1,x:(r0)+    ;si.grstart=bitpos
  148.     move        a,x:(r0)+    a,y1    ;si.grend=bitpos_new
  149.     clr    a    #<9,n7
  150.     jsr    (r5)            ;getbits(9)
  151.     lsl    a    #<8,n7        ;*2
  152.     clr    a    a,x:(r0)+    a,y0    ;si.regionend2  !!  y0
  153.     jsr    (r5)            ;getbits(8)
  154.     move        a,x:(r0)+    ;si.globalgain
  155.     clr    a    #<4,n7
  156.     jsr    (r5)            ;getbits(4)
  157.     clr    a    a,x:(r0)+    ;si.sfcompress
  158.     jsr    (r6)            ;getbit1
  159.     jeq    read_grsi_block0
  160.  
  161.     clr    a    #<2,n7
  162.     jsr    (r5)            ;getbits(2)
  163.     clr    a    a,x:(r0)+    ;si.blocktype
  164.     jsr    (r6)            ;getbit1
  165.     move        a,x:(r0)+    ;si.mixedblock
  166.     clr    a    #<5,n7
  167.     jsr    (r5)            ;getbits(5)
  168.     clr    a    a,x:(r0)+    ;si.tabsel0
  169.     jsr    (r5)            ;getbits(5)
  170.     clr    a    a,x:(r0)+    ;si.tabsel1
  171.     move        a,x:(r0)+    ;si.tabsel2=0
  172.     do    #3,read_grsi_sbg_loop
  173.     clr    a    #<3,n7
  174.     jsr    (r5)            ;getbits(3)
  175.     rep    #3
  176.     lsl    a
  177.     move        a,x:(r0)+    ;si.subblockgain012 * 8 !!!!
  178. read_grsi_sbg_loop
  179.     move    #<36,a1
  180.     move    a1,x:(r0)        ;si.regionend0
  181.     move    #>576,x0        ;x0=si.regionend1
  182.     jmp    read_grsi_block0e
  183.  
  184. read_grsi_block0
  185.     move        a,x:(r0)+    ;si.blocktype =0
  186.     move        a,x:(r0)+    ;si.mixedblock=0
  187.     move    #<5,n7
  188.     do    #3,read_grsi_tabsel_loop
  189.     jsr    (r5)            ;getbits(5)
  190.     clr    a    a,x:(r0)+    ;si.tabsel012
  191. read_grsi_tabsel_loop
  192.     rep    #3
  193.     move        a,x:(r0)+    ;si.subblockgain012
  194.     move    #<4,n7
  195.     jsr    (r5)            ;getbits(4)
  196.     move    #>1,x0
  197.     add    x0,a    x:sfbandl_p,r2    ;+1
  198.     clr    a    a,n2
  199.     move    #<3,n7
  200.     jsr    (r5)            ;getbits(3)
  201.     add    x0,a    n2,x0        ;+1
  202.     add    x0,a    x:(r2+n2),x0    ;+region0count
  203.     move    a,n2
  204.     move    x0,x:(r0)        ;si.regionend0
  205.     move    x:(r2+n2),x0        ;x0=si.regionend1
  206.  
  207. read_grsi_block0e
  208.     move    x:(r0),a
  209.     cmp    y0,a            ;? si.regionend0 > si.regionend2 ?
  210.     tpl    y0,a
  211.     tfr    x0,a    a,x:(r0)+    ;si.regionend0
  212.     cmp    y0,a            ;? si.regionend1 > si.regionend2 ?
  213.     tpl    y0,a
  214.     clr    a    a,x:(r0)+    ;si.regionend1
  215.     jsr    (r6)            ;getbit1
  216.     clr    a    a,x:(r0)+    ;si.preflag
  217.     jsr    (r6)            ;getbit1
  218.     move    #>1,y0
  219.     add    y0,a    #>32,y0
  220.     clr    a    a,x:(r0)+    ;si.sfshift + 1 !!!!
  221.     jsr    (r6)            ;getbit1
  222.     move    #<33,a1            ;33
  223.     teq    y0,a            ;32
  224.     move        a1,x:(r0)+    ;si.tabsel3
  225.  
  226. read_grsi_loop
  227.     tfr    x1,a    #<1,x1        ;granule_counter
  228.     tst    a    #>si_tab+2,r3
  229.     jeq    read_grsi_loop_head    ;second granule
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237. ;*****************************************************************************
  238. ;****** for(gr=0;gr<ngr;gr++)        ;decode 2 granules
  239.     move    #>si_tab,r0
  240.     move    #>granule0_sfsi,n0
  241.     clr    a    x:outbuf,r1
  242.  
  243. decode_granule_loop
  244.     move    r0,x:si_granule_tab_p
  245.     move    n0,x:sfsi_p
  246.     move    r1,x:outbuf
  247.     move    a,x:granule_counter
  248.  
  249. ;*****************************************************************************
  250. ;****** for(ch=0;ch<stereo;ch++)    ;read+scale 1 or 2 channels
  251.     move    #>scalefac0,r3
  252.     move    x:channels,a
  253.     move    #>xr0,r1
  254.  
  255. scale_channel_loop
  256.     move    r0,x:si_tab_p
  257.     move    r1,x:xr_p
  258.     move    a,x:channel_counter
  259.     move    r3,x:scalefac_p
  260.     
  261.  
  262. ;****** move bitstream pointer to si.grstart
  263.     move    x:si_tab_p,r1
  264.     move    #>inbuf+11,r7        ;skip sideinfo
  265.     clr    b    x:(r1),r1    ;r1=si_struct            !! r1
  266.     move    #<24,b1
  267.     move    x:(r1),a        ;si.grstart
  268. move_to_grstart
  269.     sub    b,a    (r7)+
  270.     jgt    move_to_grstart
  271.     add    b,a    (r7)-
  272.     jsr    getbits_init        ;skip bits (24bit words)
  273.     tst    a    a,n7
  274.     jsne    (r5)            ;getbits
  275.     move    #<sfcompress-si0,n1
  276.     move    x:(r1),b0        ;si.grstart - correct bit counter!
  277.  
  278.  
  279. ;*****************************************************************************
  280. ;*** read scalefactors
  281. ;*****************************************************************************
  282.     move    x:(r1+n1),n2        ;si.sfcompress
  283.     move    #>slentab0,r2
  284.     move    #>newslen,r0
  285.     move    x:(r2+n2),a
  286.     move    a,x:(r0)+        ;newslen0=slentab0[si.sfcompress]
  287.     move    #>slentab1,r2
  288.     move    a,x:(r0)+        ;newslen1=slentab0[si.sfcompress]
  289.     move    x:(r2+n2),a
  290.     move    a,x:(r0)+        ;newslen2=slentab1[si.sfcompress]
  291.     move    #<blocktype-si0,n1
  292.     move    a,x:(r0)+        ;newslen3=slentab1[si.sfcompress]
  293. ;****** select sfbtab
  294.     move    x:(r1+n1),a        ;si.blocktype
  295.     move    #>2,x0
  296.     cmp    x0,a    #>sfbtab0,a    ;sfb=sfbtab0  (blocktype!=2)
  297.     jne    read_sf_ne2
  298.     move    #<mixedblock-si0,n1
  299.     move    #>sfbtab1,x0
  300.     move    x:(r1+n1),a        ;si.mixedblock
  301.     tst    a    #>sfbtab2,a    ;sfb=sfbtab2  (mixedblock)
  302.     teq    x0,a            ;sfb=sfbtab1  (!mixedblock)
  303. read_sf_ne2
  304.     move    a,r2            ;r2=sfb
  305.     move    x:sfsi_p,r1        ;r1=sfsi
  306.     move    #>newslen,r0        ;r0=newslen  ;r3=sfp (scalefac0/1)
  307.  
  308. ;****** read scalefactors
  309.     do    #4,read_sf_loop0
  310.     move    x:(r2)+,x0        ;sfb[i]
  311.     move    x:(r2),a        ;sfb[i+1]
  312.     sub    x0,a
  313.     move    x:(r1)+,a    a,y0    ;sfsi[i]
  314.     tst    a        y0,n3    ;sfb[i+1]-sfb[i]
  315.     move    x:(r0)+,a        ;newslen[i]
  316.     jne    read_sf_skip        ;if(!sfsi[i])
  317.  
  318.     do    n3,read_sf_loop1    ;for(k=sfb[i];k<sfb[i+1];k++)
  319.     clr    a        a,x0
  320.     cmp    x0,a        x0,n7
  321.     jsne    (r5)            ;getbits
  322.     move    a,x:(r3)+    x0,a    ;*sfp++=getbits(newslen[i])
  323. read_sf_loop1
  324.     move    (r3)-n3
  325.  
  326. read_sf_skip
  327.     move    (r3)+n3            ;else sfp+=sfb[i+1]-sfb[i]
  328. read_sf_loop0
  329.  
  330.     clr    a    r1,x:sfsi_p
  331.     move    a,x:(r3)+
  332.     move    a,x:(r3)+
  333.     move    a,x:(r3)+
  334.  
  335.  
  336.  
  337. ;*****************************************************************************
  338. ;*** read huffman
  339. ;*****************************************************************************
  340.     move    x:si_tab_p,r1
  341.     move    #<blocktype-si0,n1
  342.     move    x:(r1),r1        ;r1=si_struct            !! r1
  343.  
  344. ;****** read region0
  345.     move    #<regionend0-si0,n1
  346.     move    x:xr_p,r3        ;r3=xr (output)
  347.     move    #>pow43tab,r4        ;r4=pow43tab
  348.     move    x:(r1+n1),a        ;si.regionend0
  349.     asr    a    #<tabsel0-si0,n1
  350.     move    a,n3            ;n3=loop_count
  351.     tst    a    x:(r1+n1),n0    ;si.tabsel0
  352.     jsgt    huff_region012
  353. ;****** read region1
  354.     move    #<regionend0-si0,n1
  355.     nop
  356.     move    x:(r1+n1),x0        ;si.regionend0
  357.     move    #<regionend1-si0,n1
  358.     nop
  359.     move    x:(r1+n1),a        ;si.regionend1
  360.     sub    x0,a
  361.     asr    a    #<tabsel1-si0,n1
  362.     move    a,n3            ;n3=loop_count
  363.     tst    a    x:(r1+n1),n0    ;si.tabsel1
  364.     jsgt    huff_region012
  365. ;****** read region2
  366.     move    #<regionend1-si0,n1
  367.     nop
  368.     move    x:(r1+n1),x0        ;si.regionend1
  369.     move    #<regionend2-si0,n1
  370.     nop
  371.     move    x:(r1+n1),a        ;si.regionend2
  372.     sub    x0,a
  373.     asr    a    #<tabsel2-si0,n1
  374.     move    a,n3            ;n3=loop_count
  375.     tst    a    x:(r1+n1),n0    ;si.tabsel2
  376.     jsgt    huff_region012
  377.  
  378.     jmp    huff_region012_end
  379.  
  380. ;--vv-------------------------------vv--
  381. huff_region012
  382.     move    #>htablinbits,r0
  383.     move    #>15,x1            ;x1=#15                !! x1
  384.     move    x:(r0+n0),n2        ;n2=linbits
  385.     move    #>htabs,r0
  386.     move    r1,n1            ;save r1
  387.     move    x:(r0+n0),n5        ;n5=htab
  388.     move    #>huff_dec012_end,r6    ;r6=huff_dec012_end
  389.     move    #>huff_dec012_gb_ne1,r2    ;r2=huff_dec012_gb_ne1
  390.     move    #<$10,y1        ;y1=#$100000 - shift 3 bits    !! y1
  391.  
  392.     do    n3,huff_loop012
  393.     move    n5,r0            ;tab
  394. ;---faster huffman decoder
  395. ;-based on the assumption that the overhead for "do/enddo" pays off
  396. ;-when the loop is taken several times (more than twice?)
  397.     do    #999,huff_dec012_end    ;"inifinite loop"
  398.     move    x:(r0)+,x0        ;v=*tab++
  399.     mpy    x0,y1,a    r0,r1        ;if(v>=0)
  400.     jge    (r6)    ;huff_dec012_end    ;return v
  401. ;-nop-    inc    b    ;---getbit1 inline
  402.     lsl    b    x0,n0
  403.     jne    (r2)    ;huff_dec012_gb_ne1
  404.     move    x:(r7)+,b1
  405.     rol    b
  406. huff_dec012_gb_ne1
  407.     move    (r0)-n0            ;if(getbit1)
  408.     tcc    b,a    r1,r0        ;tab-=v
  409.     inc    b    ;useful for required AGU delay
  410. huff_dec012_end
  411.     enddo                ;end of "infinite loop"
  412.  
  413.     lsr    a            ;x=val>>4
  414.     jeq    huff_r012_zero_0
  415.     eor    x1,a    a,n4        ;if(x==15)
  416.     jne    huff_r012_ne15_0
  417.     clr    a    n2,y0
  418.     cmp    y0,a    n2,n7
  419.     jsne    (r5)            ;getbits(linbits)
  420.     add    x1,a            ;+15
  421.     move    a,n4
  422. huff_r012_ne15_0
  423.     inc    b    ;---getbit1 inline
  424.     lsl    b    y:(r4+n4),a    ;v=pow43tab[x]
  425.     jne    huff_r012_gb_ne_0
  426.     move    x:(r7)+,b1
  427.     rol    b
  428. huff_r012_gb_ne_0
  429.     neg    a    a,y0        ;(keep CARRY bit!)
  430.     tcc    y0,a            ;if(getbit1) v=-v
  431. huff_r012_zero_0
  432.     tfr    x0,a    a,x:(r3)+    ;xr[i+0]=v
  433.  
  434.     and    x1,a    n2,y0        ;x=val&15 
  435.     jeq    huff_r012_zero_1
  436.     eor    x1,a    a,n4        ;if(x==15)
  437.     jne    huff_r012_ne15_1
  438.     cmp    y0,a    n2,n7
  439.     jsne    (r5)            ;getbits(linbits)
  440.     add    x1,a            ;+15
  441.     move    a,n4
  442. huff_r012_ne15_1
  443.     inc    b    ;---getbit1 inline
  444.     lsl    b    y:(r4+n4),a    ;v=pow43tab[x]
  445.     jne    huff_r012_gb_ne_1
  446.     move    x:(r7)+,b1
  447.     rol    b
  448. huff_r012_gb_ne_1
  449.     neg    a    a,y0        ;(keep CARRY bit!)
  450.     tcc    y0,a            ;if(getbit1) v=-v
  451. huff_r012_zero_1
  452.     move        a,x:(r3)+    ;xr[i+1]=v
  453. huff_loop012
  454.  
  455.     move    n1,r1            ;restore r1
  456.     rts
  457. ;--^^-------------------------------^^--
  458. huff_region012_end
  459.  
  460.  
  461. ;****** read region3
  462.     move    #<regionend2-si0,n1
  463.     move    #>576,a
  464.     move    x:(r1+n1),x0        ;si.regionend2
  465.     move    #<grend-si0,n1
  466.     sub    x0,a    #>huff_dec3_gb_ne1,r6
  467.     asr    a    x:(r1+n1),x1    ;si.grend            !! x1
  468.     asr    a    #<tabsel3-si0,n1
  469.     move    #>htabs,r0
  470.     move    x:(r1+n1),n0        ;si.tabsel3
  471.     jle    huff_region3_end    ;--> skip ( because regionend2>=576 )
  472.     move    x:(r0+n0),n1        ;n1=htab
  473.     move    a,x0    y:pow43tab+1,a
  474.     neg    a    a,n2        ;n2= pow43tab[1]        !! n2
  475.     tfr    x0,a    a,y0        ;y0=-pow43tab[1]        !! y0
  476.     move    #>huff_dec3,r1
  477.     move    #>huff_dec3_gb_ne0,r5
  478.  
  479.  
  480.     do    a,huff_loop3
  481.     move    b0,a            ;bit counter
  482.     cmp    x1,a    n1,r0        ;tab
  483.     jmi    huff_dec3_start        ;while(huffbit<si.grend)
  484.     enddo
  485.     jmp    huff_loop3
  486. huff_dec3_start
  487. ;---faster huffman decoder
  488. ;-based on the knowledge that the first table entry is always negative.
  489.     inc    b    ;---getbit1 inline
  490.     lsl    b    x:(r0)+,n0    ;v=*tab++
  491.     jne    (r5)    ;huff_dec3_gb_ne0
  492.     move    x:(r7)+,b1
  493.     rol    b
  494. huff_dec3_gb_ne0
  495.     jcc    (r1)    ;huff_dec3    ;if(getbit1)
  496.     move    (r0)-n0            ;tab-=v
  497. huff_dec3
  498.     clr    a    x:(r0)+,x0    ;v=*tab++
  499.     jclr    #23,x0,huff_dec3_end    ;if(v>=0) return v
  500.     inc    b    ;---getbit1 inline
  501.     lsl    b    x0,n0
  502.     jne    (r6)    ;huff_dec3_gb_ne1
  503.     move    x:(r7)+,b1
  504.     rol    b
  505. huff_dec3_gb_ne1
  506.     jcc    (r1)    ;huff_dec3    ;if(getbit1)
  507.     move    (r0)-n0            ;tab-=v
  508.     jmp    (r1)    ;huff_dec3
  509. huff_dec3_end
  510.  
  511.     jclr    #3,x0,huff_r3_zero_3    ;if(x=(val>>3)&1)
  512.     inc    b    ;---getbit1 inline
  513.     lsl    b    n2,a        ;x
  514.     jne    huff_r3_gb_ne_3
  515.     move    x:(r7)+,b1
  516.     rol    b
  517. huff_r3_gb_ne_3                ;if(getbit1)
  518.     tcs    y0,a            ;x=-x
  519. huff_r3_zero_3
  520.     clr    a    a,x:(r3)+    ;xr[i+0]=x
  521.  
  522.     jclr    #2,x0,huff_r3_zero_2    ;if(x=(val>>2)&1)
  523.     inc    b    ;---getbit1 inline
  524.     lsl    b    n2,a        ;x
  525.     jne    huff_r3_gb_ne_2
  526.     move    x:(r7)+,b1
  527.     rol    b
  528. huff_r3_gb_ne_2                ;if(getbit1)
  529.     tcs    y0,a            ;x=-x
  530. huff_r3_zero_2
  531.     clr    a    a,x:(r3)+    ;xr[i+1]=x
  532.  
  533.     jclr    #1,x0,huff_r3_zero_1    ;if(x=(val>>1)&1)
  534.     inc    b    ;---getbit1 inline
  535.     lsl    b    n2,a        ;x
  536.     jne    huff_r3_gb_ne_1
  537.     move    x:(r7)+,b1
  538.     rol    b
  539. huff_r3_gb_ne_1                ;if(getbit1)
  540.     tcs    y0,a            ;x=-x
  541. huff_r3_zero_1
  542.     clr    a    a,x:(r3)+    ;xr[i+2]=x
  543.  
  544.     jclr    #0,x0,huff_r3_zero_0    ;if(x=val&1)
  545.     inc    b    ;---getbit1 inline
  546.     lsl    b    n2,a        ;x
  547.     jne    huff_r3_gb_ne_0
  548.     move    x:(r7)+,b1
  549.     rol    b
  550. huff_r3_gb_ne_0                ;if(getbit1)
  551.     tcs    y0,a            ;x=-x
  552. huff_r3_zero_0
  553.     move        a,x:(r3)+    ;xr[i+3]=x
  554. huff_loop3
  555.  
  556. huff_region3_end
  557.  
  558. ; from now on we can use all registers again
  559. ; because 'getbits' is no longer active (r5, r6, r7, b)
  560.  
  561. ;set the remaining samples to zero
  562.     move        #>576,y0    ;y0=576 !!
  563.     clr    b    x:xr_p,a
  564.     add    y0,a    r3,x0        ;a=end of xr
  565.     sub    x0,a    r3,x:xr_zero_p    ;a=end - current
  566.     jle    huff_clear_loop
  567.     do    a,huff_clear_loop
  568.     move        b,x:(r3)+
  569. huff_clear_loop
  570.  
  571.  
  572.  
  573.  
  574. ;--INTENSITY STEREO-- find highest non-zero sample
  575.     move        x:modext,a        ;IS: bit0=1
  576.     lsr    a    x:channel_counter,b
  577.     jcc    is_skip_zero            ;skip if not IS
  578.     lsr    b    #>xr1+576-1,r0
  579.     jne    is_skip_zero            ;skip if not second channel
  580.     tfr    y0,a    #>1,x0            ;y0=576 (from huff_clear_loop)
  581.     move        #>is_find_zero,r4
  582. is_find_zero
  583.     sub    x0,a    x:(r0)-,b
  584.     tst    b
  585.     jeq    (r4)    ;is_find_zero
  586.     tst    a    #<0,x0
  587.     tmi    x0,a
  588.     move        a,x:x_is_nonzero
  589. is_skip_zero
  590.  
  591.  
  592.  
  593. ;*****************************************************************************
  594. ;*** scale samples
  595. ;*****************************************************************************
  596.     move    x:si_tab_p,r1
  597.     move    #<blocktype-si0,n1
  598.     move    x:(r1),r1        ;r1=si_struct            !! r1
  599. ;****** number of LONG and SHORT bands
  600.     clr    b    #>2,x0
  601.     move    x:(r1+n1),a        ;si.blocktype
  602.     move    #<13,b1            ;s_min=13 (blocktype!=2)
  603.     cmp    x0,a    #<22,a1        ;l_max=22 (blocktype!=2)
  604.     jne    scale_ne2
  605.     move    #<mixedblock-si0,n1
  606.     move    #<0,x0
  607.     move    x:(r1+n1),a        ;si.mixedblock
  608.     move    #<3,b1            ;s_min=3  (mixedblock)
  609.     tst    a    #<8,a1        ;l_max=8  (mixedblock)
  610.     teq    x0,b            ;s_min=0  (!mixedblock)
  611.     teq    x0,a            ;l_max=0  (!mixedblock)
  612. scale_ne2
  613.     move    #<globalgain-si0,n1
  614.     move    b,n5            ;n5=s_min
  615.     move    x:(r1+n1),n6        ;n6=si.globalgain
  616.     move    x:scalefac_p,r2        ;r2=sfp
  617.     move    #<sfshift-si0,n1
  618.     move    #x_quantab,n4        ;n4=quantab
  619.     move    x:(r1+n1),n2        ;n2=si.sfshift (+1 = 1 or 2)
  620.     move    #<subblockgain0-si0,n1
  621.     move    #>pretab,r4        ;r4=pretab
  622.     lua    (r1)+n1,r7        ;r7=&si.subblockgain0
  623.  
  624.  
  625. ;****** scale LONG bands
  626.     tst    a    a,x1
  627.     jeq    scale_l_loop0        ;-->skip ( because l_max==0 )
  628.     move    #<preflag-si0,n1
  629.     move    x:xr_p,r0        ;r0=xr
  630.     move    x:(r1+n1),n0        ;n0=si.preflag
  631.     move    x:sfbandl_p,r5        ;r5=bil
  632.     move    n0,a            ;preflag
  633.     move    x:xr_zero_p,n1        ;n1=xr_zero_p
  634.  
  635.     do    x1,scale_l_loop0    ;for (j=0; j<l_max; j++)
  636.     move        n1,b        ;xr_zero_p
  637.     move        r0,x1
  638.     sub    x1,b
  639.     jle    scale_l_skip        ;skip (because all samples are zero)
  640.     tst    a    x:(r4)+,x1    ;pretab[j]
  641.     tne    x1,a            ;a=(preflag ? pretab[j] : 0)
  642.     move        x:(r2)+,x1    ;*sfp++
  643.     add    x1,a    n6,x0        ;a+=sf  ;gg
  644.     rep    n2
  645.     lsl    a    r0,r1        ;a<<=sfshift (1 or 2)
  646.     neg    a    #<0,y0        ;a=-a    ;y0=0 (for DP Multiply mode!!)
  647.     add    x0,a    n4,r3        ;a+=gg  ;quantab
  648.     tmi    y0,a
  649.     lsl    a    x:(r5)+,x1    ;a<<=1  ;bil[j]
  650.     move    a,n3
  651.     move        x:(r5),b    ;bil[j+1]
  652.     sub    x1,b    (r3)+n3        ;quantab[gg-(sf+pre)<<shift]
  653.     move        x:(r3)+,x1    ;MSP
  654.     clr    a    x:(r3),x0    ;LSP    ;a=0 (for DP Multiply mode!!)
  655.  
  656. ;this is the "fastest" version of the Double Precision Multiply scaling loop
  657. ;(no checks for overflow; no "move #0,a" between two calculations)
  658. ;(assumption: the results are ALWAYS in the __lowest_18bit_of_a0__ only)
  659.     lsr    b    x:(r0),y1
  660.     ori    #$40,mr        ;enter Double Precision Multiply mode
  661.     do    b,scale_l_loop1        ;for (i=bil[j]; i<bil[j+1]; i++)
  662.     mac    x0,y1,a    (r0)+        ;LSP*SP
  663.     mac    y1,x1,a    x:(r0)+,y1    ;shifted(a)+SP*MSP
  664.     mac    x0,y1,a    a0,x:(r1)+    ;LSP*SP
  665.     mac    y1,x1,a    x:(r0),y1    ;shifted(a)+SP*MSP
  666.     move        a0,x:(r1)+
  667. scale_l_loop1
  668.     andi    #$bf,mr        ;exit Double Precision Multiply mode
  669. scale_l_skip
  670.     move    n0,a            ;preflag
  671. scale_l_loop0
  672.  
  673.  
  674. ;****** scale SHORT bands
  675.     clr    a    n5,x1        ;s_min
  676.     move    #<13,a1
  677.     sub    x1,a    x:sfbands_p,r5
  678.     jle    scale_s_loop0        ;--> skip ( because s_min>=13 )
  679.  
  680.     move        x:xr_p,r0
  681.     move        (r5)+n5        ;r5=&bis[s_min]
  682.     move        x:(r5),n0
  683.     move        n4,n5        ;n5=quantab
  684.     move        (r0)+n0        ;r0=&xr[bis[s_min]]
  685.     move        #<3,n1
  686.     move        #y_reorder,n7    ;n7=&reorder[0]
  687.     move        n7,r4        ;r4=&reorder[0]
  688.  
  689.     do    a,scale_s_loop0        ;for (j=s_min; j<13; j++)
  690.     move        x:xr_zero_p,b
  691.     move        r0,x1
  692.     sub    x1,b    x:(r5)+,x1    ;bis[j]
  693.     jle    scale_s_skip
  694.     move        x:(r5),a    ;bis[j+1]
  695.     sub    x1,a    #>$2aaaaa,x0
  696.     move    a,x1            ;(bis[j+1]-bis[j])/3
  697.     mpyr    x0,x1,b    r7,r6        ;r6=&si.subblockgain0
  698.     lsr    b    r0,n0        ;b=(inner loop count)    ;n0=&xr[bis[j]]
  699.     move        a,n4        ;n4=(copy loop count)
  700.  
  701.     do    #3,scale_s_loop1    ;for (k=0; k<3; k++)
  702.     move        x:(r2)+,a    ;a=*sfp++
  703.     rep    n2
  704.     lsl    a    x:(r6),x1    ;a<<=sfshift (1 or 2)
  705.     ;                ;x1=si.subblockgain[k]  (* 8 !!!!)
  706.     add    x1,a    n6,x0        ;a+=sbg ;gg
  707.     neg    a    #<0,y0        ;a=-a    ;y0=0 (for DP Multiply mode!!)
  708.     add    x0,a    (r6)+        ;a+=gg
  709.     tmi    y0,a
  710.     lsl    a    n5,r3        ;a<<=1    ;quantab
  711.     move    a,n3
  712.     move        r4,r1        ;r1=&reorder[k]
  713.     move        (r3)+n3        ;quantab[gg-sf<<shift-sbg]
  714.     move        x:(r3)+,x1    ;MSP
  715.     clr    a    x:(r3),x0    ;LSP    ;a=0 (for DP Multiply mode!!)
  716.  
  717. ;this is the "fastest" version of the Double Precision Multiply scaling loop
  718. ;(no checks for overflow; no "move #0,a" between two calculations)
  719. ;(assumption: the results are ALWAYS in the __lowest_18bit_of_a0__ only)
  720.     ori    #$40,mr            ;enter Double Precision Multiply mode
  721.     move        x:(r0),y1
  722.     do    b,scale_s_loop2        ;for (i=bis[j]; i<bis[j+1]; i+=3)
  723.     mac    x0,y1,a    (r0)+        ;LSP*SP
  724.     mac    y1,x1,a    x:(r0)+,y1    ;shifted(a)+SP*MSP
  725.     mac    x0,y1,a    a0,y:(r1)+n1    ;LSP*SP  ;store in y_reorder
  726.     mac    y1,x1,a    x:(r0),y1    ;shifted(a)+SP*MSP
  727.     move        a0,y:(r1)+n1    ;store in y_reorder
  728. scale_s_loop2
  729.     andi    #$bf,mr            ;exit Double Precision Multiply mode
  730.  
  731.     move        (r4)+        ;r4=&reorder[k+1]
  732. scale_s_loop1
  733.  
  734.     move        n7,r4        ;r4=&reorder[0]
  735.     move        n0,r1        ;n0=&xr[bis[j]]
  736.     move            y:(r4)+,a
  737.     do    n4,scale_s_skip
  738.     move    a,x:(r1)+    y:(r4)+,a    ;copy from y_reorder back to xr
  739. scale_s_skip
  740.     move        n7,r4        ;r4=&reorder[0]
  741. scale_s_loop0
  742.  
  743.  
  744.     move    x:si_tab_p,r0
  745.     move    #>scalefac1,r3
  746.     move    #>xr1,r1
  747.     move    x:channel_counter,a
  748.     lsr    a    (r0)+
  749.     jne    scale_channel_loop    ;next channel
  750.  
  751. ;****** for(ch=0;ch<stereo;ch++)    ;end************************
  752.  
  753.  
  754.  
  755.  
  756.  
  757.  
  758.  
  759. ;*****************************************************************************
  760. ;*** joint-stereo processing
  761. ;*****************************************************************************
  762.     clr    b    x:modext,a
  763.     tst    a    #<2,b1
  764.     jeq    js_end                ;modext==0 -> no joint-stereo
  765.     cmp    b,a    #>xr0,r0
  766.     move        #>xr1,r1
  767.     jne    js_modext_1_3
  768.  
  769. ;****** modext==2 - MID/SIDE STEREO for all samples
  770.     move    r1,r2
  771.     move    #0.70710678,y0            ;sqrt(0.5)
  772.     move            x:(r0),x0
  773.     mpy    x0,y0,a        x:(r1)+,x1
  774.     macr    x1,y0,a
  775.     mpy    x0,y0,b        a,x:(r0)+
  776.     macr    -x1,y0,b    x:(r0),x0
  777.     do    #576-1,js_ms_loop
  778.     mpy    x0,y0,a        x:(r1)+,x1
  779.     macr    x1,y0,a        b,x:(r2)+
  780.     mpy    x0,y0,b        a,x:(r0)+
  781.     macr    -x1,y0,b    x:(r0),x0
  782. js_ms_loop
  783.     move            b,x:(r2)+
  784.     jmp    js_end
  785.  
  786.  
  787.  
  788. ;****** modext==1 or 3 - INTENSITY STEREO
  789. js_modext_1_3
  790.     move        #>scalefac1,r2        ;scalefac1        !! r2
  791.     move        #>ktab,r6        ;ktab            !! r6
  792.     clr    b    x:si_tab_p,r3
  793.     move        #<blocktype-si0,n3
  794.     move        #<2,b1
  795.     move        x:(r3),r3
  796.     move        x:x_is_nonzero,x1    ;            !! x1
  797.     move        x:(r3+n3),x0        ;si.blocktype
  798.     cmp    x0,b    a,n7            ;n7=modext        !! n7
  799.     jeq    js_is_blocktype2
  800.  
  801. ;** blocktype != 2 (long bands only)
  802. ;r0=xr0   r1=xr1   r2=scalefac1   r6=ktab   x1=is_nonzero   n7=modext
  803.     move        #>scalefac1+20,r3
  804.     move        x:sfbandl_p,r5        ;r5 !!
  805.     move        r5,r4    ;r4 - for limitloop
  806.     move        x:(r3)+,x0
  807.     move        x0,x:(r3)        ;copy sf[20] to sf[21]
  808.     move        r2,r3    ;r3 - for limitloop
  809.     ;------    find scalefactor boundary where INTENSITY STEREO begins
  810. js_is_limitloop_long
  811.     move        x:(r4)+,a        ;bil[i]
  812.     cmp    x1,a    #<7,b1
  813.     jgt    js_is_limit_long        ;? bil[i] > is_nonzero ?
  814.     move        b1,x:(r3)+        ;scalefactor=7 (no IS)
  815.     jmp    js_is_limitloop_long
  816. js_is_limit_long
  817.     ;------    process all scalefactor bands
  818.     do    #22,js_is_loop_long
  819.     move        x:(r5)+,x0        ;bil[i]
  820.     clr    b    x:(r5),a        ;bil[i+1]
  821.     sub    x0,a    #<7,b1
  822.     move        x:(r2)+,x0        ;sf[i]
  823.     cmp    x0,b    a,n0
  824.     move        a,n1
  825.     move        x0,n6
  826.     move        x:(r0),x0
  827.     jeq    js_is_sf7_long
  828.     ;------    scalefactor != 7
  829.     move        l:(r6+n6),y        ;y1=ktab[sf][0]  y0=ktab[sf][1]
  830.     do    n0,js_is_isloop_long
  831.     mpyr    x0,y1,a
  832.     mpyr    x0,y0,a        a,x:(r0)+
  833.     move            x:(r0),x0
  834.     move            a,x:(r1)+
  835. js_is_isloop_long
  836.     jmp    js_is_msloop_long        ;rewind xr pointers
  837.     ;------    scalefactor == 7
  838. js_is_sf7_long
  839.     jclr    #1,n7,js_is_skipms_long        ;? is it MID/SIDE STEREO ?
  840.     move        #0.70710678,y0        ;sqrt(0.5)
  841.     do    n0,js_is_msloop_long
  842.     mpy    x0,y0,a        x:(r1),x1
  843.     macr    x1,y0,a
  844.     mpy    x0,y0,b        a,x:(r0)+
  845.     macr    -x1,y0,b    x:(r0),x0
  846.     move            b,x:(r1)+
  847. js_is_msloop_long
  848.     move        (r0)-n0            ;rewind xr pointers
  849.     move        (r1)-n1
  850. js_is_skipms_long
  851.     move        (r0)+n0            ;forward xr pointers
  852.     move        (r1)+n1
  853. js_is_loop_long
  854.     jmp    js_end
  855.  
  856.  
  857. ;!! this implementation is still missing some features !!
  858. ;-mixed blocks are not handled here
  859. ;-the IS-boundary is not detected 100% correctly for short bands
  860. ;this could result in some minor (hardly audible) distortions when playing
  861. ;mp3 files that actually use those these features (_most_ files do not!)
  862.  
  863. js_is_blocktype2
  864. ;** blocktype == 2 (short bands)
  865. ;r0=xr0   r1=xr1   r2=scalefac1   r6=ktab   x1=is_nonzero   n7=modext
  866.     move        #>scalefac1+33,r3
  867.     move        #<2,n3
  868.     move        x:sfbands_p,r5        ;r5 !!
  869.     move        x:(r3)+,x0
  870.     move        x0,x:(r3+n3)        ;copy sf[33] to sf[36]
  871.     move        x:(r3)+,x0
  872.     move        x0,x:(r3+n3)        ;copy sf[34] to sf[37]
  873.     move        x:(r3)+,x0
  874.     move        x0,x:(r3+n3)        ;copy sf[35] to sf[38]
  875.     move        x1,n2            ;n2=is_nonzero
  876.     move        r0,r3
  877.     move        r1,r4
  878.     ;------    process all scalefactor bands
  879.     do    #13,is_short_loop
  880.     move        x:(r5)+,x0        ;bis[i]
  881.     move        x:(r5),a        ;bis[i+1]
  882.     move        x0,n3
  883.     move        x0,n4
  884.     sub    x0,a    #>$2aaaaa,x0
  885.     move        a,x1
  886.     mpyr    x0,x1,a    #<3,n0            ;(bis[j+1]-bis[j])/3
  887.     move        a,n5            ;(inner loop counter)
  888.     ;------    three scalefactors in each band
  889.     do    #3,is_short_3_loop
  890.     lua    (r3)+n3,r0
  891.     lua    (r4)+n4,r1
  892.     clr    b    x:(r2)+,x0        ;sf[i]
  893.     move        #<7,b1
  894.     cmp    x0,b    #<3,n1
  895.     jeq    is_short_sf7            ;? scalefactor == 7 (SKIP) ?
  896.     move        n3,a            ;bis[i]  ??? + 0/1/2 ???
  897.     move        n2,x1            ;is_nonzero
  898.     cmp    x1,a    x0,n6
  899.     jle    is_short_sf7            ;? in NON-ZERO region (SKIP) ?
  900.     ;------    scalefactor != 7
  901.     move        x:(r0),x0
  902.     move        l:(r6+n6),y        ;y1=ktab[sf][0]  y0=ktab[sf][1]
  903.     do    n5,is_short_isloop
  904.     mpyr    x0,y1,a
  905.     mpyr    x0,y0,a        a,x:(r0)+n0
  906.     move            x:(r0),x0
  907.     move            a,x:(r1)+n1
  908. is_short_isloop
  909.     jmp    is_short_msloop
  910.     ;------    scalefactor == 7
  911. is_short_sf7
  912.     jclr    #1,n7,is_short_msloop        ;? is it MID/SIDE STEREO ?
  913.     move        #0.70710678,y0        ;sqrt(0.5)
  914.     move            x:(r0),x0
  915.     do    n5,is_short_msloop
  916.     mpy    x0,y0,a        x:(r1),x1
  917.     macr    x1,y0,a
  918.     mpy    x0,y0,b        a,x:(r0)+n0
  919.     macr    -x1,y0,b    x:(r0),x0
  920.     move            b,x:(r1)+n1
  921. is_short_msloop
  922.     move        x:(r3)+,x0    y:(r4)+,y0    ;advance pointers r3, r4
  923. is_short_3_loop
  924.     rep    #3
  925.     move        x:(r3)-,x0    y:(r4)-,y0    ;rewind pointers r3, r4
  926. is_short_loop
  927.  
  928.  
  929. js_end
  930.  
  931.  
  932.  
  933.  
  934.  
  935. ;*****************************************************************************
  936. ;****** for(ch=0;ch<stereo;ch++)    ;filter+synthesize 1 or 2 channels
  937.     move    x:si_granule_tab_p,r0
  938.     move    #>xr0,r1
  939.     move    #>hybrid_prev0,r2
  940.     move    #>synth_audio_l_p,r3
  941.     move    x:channels,a
  942.  
  943. hybrid_synth_channel_loop
  944.     move    r0,x:si_tab_p
  945.     move    r1,x:xr_p
  946.     move    r2,x:prev_p
  947.     move    r3,x:synth_audio_pp
  948.     move    a,x:channel_counter
  949.  
  950.  
  951. ;*****************************************************************************
  952. ;*** hybrid filter
  953. ;*****************************************************************************
  954.     move    x:si_tab_p,r1
  955.     move    #<blocktype-si0,n1
  956.     clr    b    x:(r1),r1    ;r1=si_struct
  957. ;****** select LONG / SHORT limit
  958.     move    #<2,b1
  959.     clr    a    x:(r1+n1),x0    ;x0=si.blocktype
  960.     cmp    x0,b    #<32,a1        ; a=lim=32 (blocktype!=2)
  961.     jne    hybrid_block_ne2
  962.     move    #<mixedblock-si0,n1
  963.     move    #<0,x0            ;x0=0 (blocktype in mixedblock)
  964.     move    x:(r1+n1),a        ;si.mixedblock
  965.     tst    a    b,a        ; a=lim=2  (mixedblock)
  966.     teq    x0,a            ; a=lim=0  (!mixedblock)
  967. hybrid_block_ne2
  968.  
  969.     move    a,n1            ;n1=lim              !! IMDCT !!
  970.     clr    b    #<36,n0
  971.     cmp    x0,b    #>imdct_windows,r0
  972.     jeq    hybrid_win0        ;;had been 'jle'  ... stupid bug!
  973.     rep    x0
  974.     move    (r0)+n0            ;r0=&win[blocktype]  !! IMDCT !!
  975. hybrid_win0
  976.  
  977.  
  978. ;****** antialias butterflies
  979.     move    #<1,b1
  980.     sub    b,a    x:xr_p,r4
  981.     jle    antialias_loop        ;--> skip  ( because lim<=1 )
  982.  
  983.     move    #<18,n4
  984.     move    x:cs_ca_tab_p,r3
  985.     movec    #<16-1,m3        ;modulo-16 addressing
  986.     move    (r4)+n4            ;upper band
  987.     move    r4,r2            ;upper band
  988.     lua    (r4)-,r5        ;lower band
  989.     move    #<18-8+1,n2
  990.     move    #<18-8+1,n4
  991.     move    #<18+8,n5
  992.     move            x:(r5),x0    y:(r3)+,y0
  993.     move    (r5)-n5
  994.  
  995.     do    a,antialias_loop
  996.     mpy    x0,y0,a        x:(r4)+,x1    y:(r3)+,y1
  997.     macr    -x1,y1,a    (r5)+n5                ;update r5
  998.     mpy    x1,y0,b        a,x:(r5)-    y:(r3)+,y0
  999.     macr    x0,y1,b        x:(r5),x0    y:(r3)+,y1
  1000.     mpy    x0,y0,a        x:(r4)+,x1
  1001.     macr    -x1,y1,a    b,x:(r2)+
  1002.     mpy    x1,y0,b        a,x:(r5)-    y:(r3)+,y0
  1003.     macr    x0,y1,b        x:(r5),x0    y:(r3)+,y1
  1004.     mpy    x0,y0,a        x:(r4)+,x1
  1005.     macr    -x1,y1,a    b,x:(r2)+
  1006.     mpy    x1,y0,b        a,x:(r5)-    y:(r3)+,y0
  1007.     macr    x0,y1,b        x:(r5),x0    y:(r3)+,y1
  1008.     mpy    x0,y0,a        x:(r4)+,x1
  1009.     macr    -x1,y1,a    b,x:(r2)+
  1010.     mpy    x1,y0,b        a,x:(r5)-    y:(r3)+,y0
  1011.     macr    x0,y1,b        x:(r5),x0    y:(r3)+,y1
  1012.     mpy    x0,y0,a        x:(r4)+,x1
  1013.     macr    -x1,y1,a    b,x:(r2)+
  1014.     mpy    x1,y0,b        a,x:(r5)-    y:(r3)+,y0
  1015.     macr    x0,y1,b        x:(r5),x0    y:(r3)+,y1
  1016.     mpy    x0,y0,a        x:(r4)+,x1
  1017.     macr    -x1,y1,a    b,x:(r2)+
  1018.     mpy    x1,y0,b        a,x:(r5)-    y:(r3)+,y0
  1019.     macr    x0,y1,b        x:(r5),x0    y:(r3)+,y1
  1020.     mpy    x0,y0,a        x:(r4)+,x1
  1021.     macr    -x1,y1,a    b,x:(r2)+
  1022.     mpy    x1,y0,b        a,x:(r5)-    y:(r3)+,y0
  1023.     macr    x0,y1,b        x:(r5),x0    y:(r3)+,y1
  1024.     mpy    x0,y0,a        x:(r4)+n4,x1            ;update r4
  1025.     macr    -x1,y1,a    b,x:(r2)+
  1026.     mpy    x1,y0,b        a,x:(r5)-    y:(r3)+,y0    ;!y0
  1027.     macr    x0,y1,b        x:(r5+n5),x0            ;!x0
  1028.     move            b,x:(r2)+n2            ;update r2
  1029. antialias_loop
  1030.  
  1031.     movec    m7,m3            ;linear addressing
  1032.  
  1033.  
  1034.  
  1035.     move    x:xr_p,r7        ;r7=xr                !! r7
  1036.     move    x:prev_p,n6        ;n6=prev            !! n6
  1037.     move    #<0,n2            ;n2=sb&1 (even or odd subband)    !! n2
  1038.  
  1039. ;****** IMDCT for LONG bands
  1040.     move    n1,a            ;lim
  1041.     tst    a    r0,n7        ;n7=&win[blocktype]        !! n7
  1042.     jle    imdct_l_loop0        ;--> skip  ( because lim<=0 )
  1043.     do    a,imdct_l_loop0
  1044.  
  1045. ;-- 1. input aliasing for 36pts idct
  1046.     move    r7,r1                ;get r1 (input pointer)
  1047.     move    x:synth_imfct_p,r5        ;r5=imdct input area
  1048.     movec    #<18-1,m5            ;m5 -> modulo-18 addressing
  1049.     move        x:(r1)+,a
  1050.     move        x:(r1)+,x0    a,y0
  1051.     add    x0,a    x:(r1)+,x0    a,y:(r5)+
  1052.     sub    y0,a    x:(r1)+,x1    a,y:(r5)+
  1053.     add    x0,a    x0,y1
  1054.     add    y0,a    x:(r1)+,x0    a,y:(r5)+
  1055.     add    x1,a    x1,b
  1056.     do    #3,imdct_l_input_alias
  1057.     add    x0,b    x0,y0
  1058.     move        x:(r1)+,x1    a,y:(r5)+
  1059.     add    y1,b    x:(r1)+,x0    b,y:(r5)+
  1060.     add    x1,b    x1,a
  1061.     add    x0,a    x0,y1
  1062.     move        x:(r1)+,x1    b,y:(r5)+
  1063.     add    y0,a    x:(r1)+,x0    a,y:(r5)+
  1064.     add    x1,a    x1,b
  1065. imdct_l_input_alias
  1066.     add    x0,b    #<9-1,n0
  1067.     move        x:(r1)+,x1    a,y:(r5)+
  1068.     add    y1,b            b,y:(r5)+
  1069.     add    x1,b    #<4,n5
  1070.     move                b,y:(r5)+
  1071.  
  1072. ;-- 2. 9pts idct/butterflies/twiddle factors for even indices,
  1073. ;      and 36pts idct twiddle factors
  1074.     move    r5,r0                ;r0=&e0 (9 words in X: mem)
  1075.     move    #>imdct_l_tab,r2        ;r2=imdct coefficients
  1076.     lua    (r0)+n0,r1            ;r1=&e7 (should be named e8!)
  1077.     move                y:(r5)+n5,y0    ;;;
  1078.     tfr    y0,a    x:(r2)+,x0    y:(r5)+n5,y1
  1079.  
  1080.     mac    x0,y1,a    x:(r2)+,x0    y:(r5)+n5,y0
  1081.     mac    x0,y0,a    x:(r2)+,x1    y:(r5)+n5,y0    ;>>> 0.5    !! x1
  1082.     mac    x1,y0,a    x:(r2)+,x0    y:(r5)+n5,y0
  1083.     mac    x0,y0,a    x:(r2)+,x0    y:(r5)+n5,y0    ;a'=tmp0/2
  1084.     asl    a                    ;a=tmp0
  1085.     mpy    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1086.     mac    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1087.     mac    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1088.     mac    x0,y0,b            y:(r5)+n5,y0    ;b'=tmp0_/2
  1089.     addl    a,b            y:(r5)+n5,y1    ;b=b'*2+a=b+a=e0 >>>0.5
  1090.     subl    b,a    b,x:(r0)+        ;a=a*2-b=2*a-(b+a)=a-b=e7
  1091.     tfr    y0,a    a,x:(r1)-
  1092.  
  1093.     mac    x1,y1,a            y:(r5)+n5,y0    ;>>> -0.5
  1094.     mac    -x1,y0,a        y:(r5)+n5,y0    ;>>> -1
  1095.     sub    y0,a            y:(r5)+n5,y0    ;>>> -0.5
  1096.     mac    -x1,y0,a x:(r2)+,x0    y:(r5)+n5,y0    ;a'=tmp1/2  >>> 1.73/2
  1097.     asl    a            (r5)+n5        ;a=tmp0  >>> 0
  1098.     mpy    x0,y0,b            y:(r5)+n5,y0    ;>>> -1.73/2
  1099.     mac    -x0,y0,b        y:(r5)+n5,y0    ;>>> -1.73/2
  1100.     mac    -x0,y0,b        y:(r5)+n5,y0    ;b'=tmp1_/2    ;;;
  1101.     addl    a,b    x:(r2)+,x0    y:(r5)+n5,y1    ;b=b'*2+a=b+a=e1
  1102.     subl    b,a    b,x:(r0)+        ;a=a*2-b=2*a-(b+a)=a-b=e6
  1103.     tfr    y0,a    a,x:(r1)-
  1104.  
  1105.     mac    x0,y1,a    x:(r2)+,x0    y:(r5)+n5,y0
  1106.     mac    x0,y0,a            y:(r5)+n5,y0    ;>>> 0.5
  1107.     mac    x1,y0,a    x:(r2)+,x0    y:(r5)+n5,y0
  1108.     mac    x0,y0,a    x:(r2)+,x0    y:(r5)+n5,y0    ;a'=tmp2/2
  1109.     asl    a                    ;a=tmp2
  1110.     mpy    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1111.     mac    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1112.     mac    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1113.     mac    x0,y0,b            y:(r5)+n5,y0    ;b'=tmp2_/2    ;;;
  1114.     addl    a,b    x:(r2)+,x0    y:(r5)+n5,y1    ;b=b'*2+a=b+a=e2
  1115.     subl    b,a    b,x:(r0)+        ;a=a*2-b=2*a-(b+a)=a-b=e5
  1116.     tfr    y0,a    a,x:(r1)-
  1117.  
  1118.     mac    x0,y1,a    x:(r2)+,x0    y:(r5)+n5,y0
  1119.     mac    x0,y0,a            y:(r5)+n5,y0    ;>>> 0.5
  1120.     mac    x1,y0,a    x:(r2)+,x0    y:(r5)+n5,y0
  1121.     mac    x0,y0,a    x:(r2)+,x0    y:(r5)+n5,y0    ;a'=tmp3/2
  1122.     asl    a    #<18,n0        ;!;        ;a=tmp3
  1123.     mpy    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1124.     mac    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1125.     mac    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1126.     mac    x0,y0,b            y:(r5)+n5,y0    ;b'=tmp3_/2    ;;;
  1127.     addl    a,b            y:(r5)+n5,y1    ;b=b'*2+a=b+a=e3
  1128.     subl    b,a    b,x:(r0)        ;a=a*2-b=2*a-(b+a)=a-b=e4
  1129.     tfr    y0,a    a,x:(r1)-
  1130.  
  1131.     sub    y1,a            y:(r5)+n5,y0
  1132.     add    y0,a            y:(r5)+n5,y0    
  1133.     sub    y0,a            y:(r5)+n5,y0    
  1134.     add    y0,a            (r5)-
  1135.     move        a,x:(r1)    y:(r5)+n5,y0
  1136.  
  1137. ;-- 3. 9pts idct/butterflies/twiddle factors for odd indices,
  1138. ;      and 36pts idct twiddle factors
  1139.     tfr    y0,a    x:(r2)+,x0    y:(r5)+n5,y1
  1140.     mac    x0,y1,a    x:(r2)+,x0    y:(r5)+n5,y0
  1141.     mac    x0,y0,a            y:(r5)+n5,y0    ;;; >>> 0.5
  1142.     mac    x1,y0,a    x:(r2)+,x0    y:(r5)+n5,y0
  1143.     mac    x0,y0,a    x:(r2)+,x0    y:(r5)+n5,y0    ;a'=tmp0o/2
  1144.     asl    a    x:synth_imfct_p,r0    ;!;    ;a=tmp0o
  1145.     mpy    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1146.     mac    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1147.     mac    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1148.     mac    x0,y0,b    (r0)+n0        ;!;r0=&o0    ;b'=tmp0_o/2
  1149.     addl    a,b    n1,n0        ;!;        ;b=b'*2+a=b+a
  1150.     subl    b,a    #<9-1,n1    ;!;         ;a=a*2-b=2*a-(b+a)=a-b
  1151.     rnd    b    r0,r1        ;!;
  1152.     rnd    a    x:(r2)+,x0    b,y1
  1153.     mpyr    x0,y1,b    x:(r2)+,x0    a,y1        ;(a+b)*0.501..=o0
  1154.     mpy    x0,y1,a            b,y:(r0)+    ;;y:<o0 ;(a-b)*5.736/8
  1155.     asl    a    (r1)+n1        ;!;r1=&o7
  1156.     asl    a            y:(r5)+n5,y0    ;;; >>> 1
  1157.     asl    a            y:(r5)+n5,y1    ;;; >>> 0.5
  1158.     rnd    a    n0,n1        ;!;        ;*8=o7
  1159.     tfr    y0,a            a,y:(r1)-    ;;y:<o7
  1160.  
  1161.     mac    x1,y1,a            y:(r5)+n5,y0    ;;; >>> -0.5
  1162.     mac    -x1,y0,a        y:(r5)+n5,y0    ;;; >>> -1
  1163.     sub    y0,a            y:(r5)+n5,y0    ;;; >>> -0.5
  1164.     mac    -x1,y0,a x:(r2)+,x0    y:(r5)+n5,y0    ;a'=tmp1o/2 >>> 1.73/2
  1165.     asl    a            (r5)+n5        ;a=tmp1o  >>> 0
  1166.     mpy    x0,y0,b            y:(r5)+n5,y0    ;;; >>> -1.73/2
  1167.     mac    -x0,y0,b        y:(r5)+n5,y0    ;;; >>> -1.73/2
  1168.     mac    -x0,y0,b                ;b'=tmp1_o/2
  1169.     addl    a,b    x:(r2)+,x0            ;b=b'*2+a=b+a
  1170.     subl    b,a    b,y1                ;a=a*2-b=2*a-(b+a)=a-b
  1171.     mpyr    x0,y1,b    x:(r2)+,x0    a,y1        ;(a+b)*0.517..=o1
  1172.     mpy    x0,y1,a            b,y:(r0)+    ;;y:<o1 ;(a-b)*1.931/2
  1173.     asl    a            y:(r5)+n5,y0    ;;; >>> 1
  1174.     rnd    a    x:(r2)+,x0    y:(r5)+n5,y1    ;*2=o6  >>> -0.34/2
  1175.     tfr    y0,a            a,y:(r1)-    ;;y:<o6
  1176.  
  1177.     mac    x0,y1,a    x:(r2)+,x0    y:(r5)+n5,y0    ;;; >>> -1.87/2
  1178.     mac    x0,y0,a            y:(r5)+n5,y0    ;;; >>> 0.5
  1179.     mac    x1,y0,a    x:(r2)+,x0    y:(r5)+n5,y0
  1180.     mac    x0,y0,a    x:(r2)+,x0    y:(r5)+n5,y0    ;a'=tmp2o/2
  1181.     asl    a                    ;a=tmp2o
  1182.     mpy    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1183.     mac    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1184.     mac    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1185.     mac    x0,y0,b                    ;b'=tmp2_o/2
  1186.     addl    a,b    x:(r2)+,x0            ;b=b'*2+a=b+a
  1187.     subl    b,a    b,y1                ;a=a*2-b=2*a-(b+a)=a-b
  1188.     mpyr    x0,y1,b    x:(r2)+,x0    a,y1        ;(a+b)*0.551..=o2
  1189.     mpy    x0,y1,a            b,y:(r0)+    ;;y:<o2 ;(a-b)*1.183/2
  1190.     asl    a            y:(r5)+n5,y0    ;;; >>> 1
  1191.     rnd    a    x:(r2)+,x0    y:(r5)+n5,y1    ;*2=o5  >>> -1.53/2
  1192.     tfr    y0,a            a,y:(r1)-    ;;y:<o5
  1193.  
  1194.     mac    x0,y1,a    x:(r2)+,x0    y:(r5)+n5,y0    ;;; >>> 0.34/2
  1195.     mac    x0,y0,a            y:(r5)+n5,y0    ;;; >>> 0.5
  1196.     mac    x1,y0,a    x:(r2)+,x0    y:(r5)+n5,y0
  1197.     mac    x0,y0,a    x:(r2)+,x0    y:(r5)+n5,y0    ;a'=tmp3o/2
  1198.     asl    a                    ;a=tmp3o
  1199.     mpy    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1200.     mac    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1201.     mac    x0,y0,b    x:(r2)+,x0    y:(r5)+n5,y0
  1202.     mac    x0,y0,b    x:synth_imfct_p,r4    ;!;    ;b'=tmp3_o/2
  1203.     addl    a,b    x:(r2)+,x0            ;b=b'*2+a=b+a
  1204.     subl    b,a    b,y1                ;a=a*2-b=2*a-(b+a)=a-b
  1205.     mpyr    x0,y1,b    x:(r2)+,x0    a,y1        ;(a+b)*0.610..=o3
  1206.     mpyr    x0,y1,a            b,y:(r0)    ;;y:<o3 ;(a-b)*0.871=o4
  1207.     move                a,y:(r1)-    ;;y:<o4
  1208.     move        x:(r2)+,x0    y:(r5)+n5,y0    ;compute tmp4o
  1209.     mpy     x0,y0,a        y:(r5)+n5,y0    ;;;
  1210.     mac    -x0,y0,a        y:(r5)+n5,y0    ;;;
  1211.     mac     x0,y0,a        y:(r5)+n5,y0    ;;;
  1212.     mac    -x0,y0,a        y:(r5)+n5,y0    ;;;
  1213.     movec    m7,m5        ;restore linear addressing
  1214.     mac    x0,y0,a    #<18,n5            ;!;
  1215.     asl    a    r4,r5            ;!;
  1216.     rnd    a    r4,r0            ;!;    ;a*2=tmp4o
  1217.     move        x:(r2),r2            ;imdct_l_tab2_p
  1218.     move        x:(r5)+n5,a    a,y:(r1)    ;;y:<o3b
  1219. ;            ;!; update r5
  1220. ;-- 4. 18pts idct
  1221. ;    ;r4=tmp ;r0=e0 ;r5=o0 ;r2=first coefficient
  1222.     move         x:(r2)+,x0    y:(r5)+,y0    ;x0=-0.250.. | y0=o0
  1223.     mpy    x0,y0,a     x:(r0)+,x1
  1224.     macr    x0,x1,a     x:(r2)+,x0    y:(r5)+,y0
  1225.     do    #8,imdct_l_tmp0_8
  1226.     mpy    x0,y0,a     x:(r0)+,x1    a,y:(r4)+
  1227.     macr    x0,x1,a     x:(r2)+,x0    y:(r5)+,y0    ;a=tmp[1], tmp[2], ...
  1228. imdct_l_tmp0_8
  1229.     move         x:(r0)-,x1    y:(r5)-,y0    ;update r0, r5
  1230.     move                 (r5)-
  1231.     move                 y:(r5)-,y0
  1232.     mpy    -x0,y0,a x:(r0)-,x1    a,y:(r4)+
  1233.     macr    x0,x1,a     x:(r2)+,x0    y:(r5)-,y0    ;a=tmp[9]
  1234.     mpy    -x0,y0,a x:(r0)-,x1    a,y:(r4)+
  1235.     macr    x0,x1,a     x:(r2)+,x0    y:(r5)-,y0    ;a=tmp[10]
  1236.     mpy    -x0,y0,a x:(r0)-,x1    a,y:(r4)+
  1237.     macr    x0,x1,a     x:(r2)+,x0    y:(r5)-,y0    ;a=tmp[11]
  1238.     mpy    -x0,y0,a x:(r0)-,x1    a,y:(r4)+
  1239.     macr    x0,x1,a     x:(r2)+,x0    y:(r5)-,y0    ;a=tmp[12]
  1240.     mpy    -x0,y0,a x:(r0)-,x1    a,y:(r4)+
  1241.     macr    x0,x1,a     x:(r2)+,x0    y:(r5)-,y0    ;a=tmp[13]/2
  1242.     asl    a                     ;a=tmp[13]
  1243.     mpy    -x0,y0,a x:(r0)-,x1    a,y:(r4)+
  1244.     macr    x0,x1,a     x:(r2)+,x0    y:(r5)-,y0    ;a=tmp[14]
  1245.     mpy    -x0,y0,a x:(r0)-,x1    a,y:(r4)+
  1246.     macr    x0,x1,a     x:(r2)+,x0    y:(r5)-,y0    ;a=tmp[15]/2
  1247.     asl    a                     ;a=tmp[15]
  1248.     mpy    -x0,y0,a x:(r0)-,x1    a,y:(r4)+
  1249.     macr    x0,x1,a     x:(r2)+,x0    y:(r5)-,y0    ;a=tmp[16]/2
  1250.     asl    a     #<8,n5        ;!;#<8,n5    ;a=tmp[16]
  1251.     mpy    -x0,y0,a x:(r0)-,x1    a,y:(r4)+
  1252.     mac    x0,x1,a     r7,r0        ;!;&xr[sb]    ;a=tmp[17]/8
  1253.     asl    a     n7,r1        ;!;&win
  1254.     asl    a     r4,r5
  1255.     asl    a                     ;a=tmp[17]
  1256.     rnd    a     (r5)-n5    ;!;&tmp[9]
  1257.     move                 a,y:(r4)
  1258.     move         n6,r4        ;!;&prev
  1259.  
  1260. ;-- 5. shift to imdct and save final result
  1261. ;    ;r5=&tmp[9] ;r4=&prev[sb] ;r1=&win[blocktype] ;r0=&xr[sb]
  1262. ;    ;... a.k.a. ...  s[sb][0] ... t_win[type][0]  ... res[sb]
  1263.     move         x:(r1)+,x0    y:(r5)+,y0
  1264.     move                 y:(r4)+,a
  1265.     macr    -x0,y0,a         y:(r4)+,b
  1266.     jclr    #0,n2,imdct_l_even            ;even or odd subband?
  1267.     do    #4,imdct_l_odd_final
  1268.     neg    b     x:(r1)+,x0    y:(r5)+,y0    
  1269.     macr    x0,y0,b     a,x:(r0)+    y:(r4)+,a
  1270.     move         x:(r1)+,x0    y:(r5)+,y0
  1271.     macr    -x0,y0,a b,x:(r0)+    y:(r4)+,b
  1272. imdct_l_odd_final
  1273.     move    (r5)-
  1274.     do    #5,imdct_l_odd_final2
  1275.     move         x:(r1)+,x0    y:(r5)-,y0    
  1276.     macr    x0,y0,b     a,x:(r0)+    y:(r4)+,a
  1277.     neg    b     x:(r1)+,x0    y:(r5)-,y0
  1278.     macr    x0,y0,a     b,x:(r0)+    y:(r4)+,b
  1279. imdct_l_odd_final2
  1280.     jmp    imdct_l_upd_prev
  1281.  
  1282. imdct_l_even
  1283.     do    #4,imdct_l_even_final
  1284.     move         x:(r1)+,x0    y:(r5)+,y0
  1285.     macr    -x0,y0,b a,x:(r0)+    y:(r4)+,a
  1286.     move         x:(r1)+,x0    y:(r5)+,y0
  1287.     macr    -x0,y0,a b,x:(r0)+    y:(r4)+,b
  1288. imdct_l_even_final
  1289.     move    (r5)-
  1290.     do    #5,imdct_l_even_final2
  1291.     move         x:(r1)+,x0    y:(r5)-,y0    
  1292.     macr    x0,y0,b     a,x:(r0)+    y:(r4)+,a
  1293.     move         x:(r1)+,x0    y:(r5)-,y0
  1294.     macr    x0,y0,a     b,x:(r0)+    y:(r4)+,b
  1295. imdct_l_even_final2
  1296.  
  1297. ;-- 6. update 'prev' for next imdct
  1298. imdct_l_upd_prev
  1299.     move    n6,r4
  1300.     do    #9,imdct_l_upd_prev1
  1301.     mpyr    x0,y0,a    x:(r1)+,x0    y:(r5)-,y0
  1302.     move                a,y:(r4)+
  1303. imdct_l_upd_prev1
  1304.     move    (r5)+
  1305.     move    (r5)+
  1306.     move                y:(r5)+,y0
  1307.     do    #9,imdct_l_upd_prev2
  1308.     mpyr    x0,y0,a    x:(r1)+,x0    y:(r5)+,y0
  1309.     move                a,y:(r4)+
  1310. imdct_l_upd_prev2
  1311.     move    r0,r7                ;update xr pointer
  1312.     move    r4,n6                ;update prev pointer
  1313.     bchg    #0,n2                ;toggle subband (even/odd)
  1314. imdct_l_loop0
  1315.  
  1316.  
  1317.  
  1318. ;    ;n1=lim ;r7=xr(in/out) ;n6=prev ;n2=sb&1
  1319.  
  1320. ;****** IMDCT for SHORT bands
  1321.     clr    a    n1,x0        ;lim
  1322.     move    #<32,a1
  1323.     sub    x0,a    r7,n7        ;n7=xr                !! n7
  1324.     jle    imdct_s_loop0        ;--> skip  ( because lim>=32 )
  1325.  
  1326.     do    a,imdct_s_loop0
  1327. ;-- 1. clear the out table
  1328.     clr    a    x:synth_imfct_p,r0
  1329.     move    #<36-6,n0
  1330.     rep    #36
  1331.     move    a,y:(r0)+
  1332.     lua    (r0)-n0,r6        ;r6=&out[6]
  1333.     move    #<40-36,n0
  1334.     move    n7,r1            ;r1=xr (input)
  1335.     move    #<3,n1
  1336.     lua    (r0)+n0,r5        ;r5=&in[0] (align 8!!)
  1337.     movec    #<6-1,m5        ;(modulo-6 addressing)
  1338.  
  1339.     do    #3,imdct_s_next        ;three imdct to do
  1340. ;-- 2. input aliasing for 36/18 pts idct
  1341.     move        x:(r1)+n1,a
  1342.     move        x:(r1)+n1,x0    a,y0
  1343.     add    x0,a    x:(r1)+n1,x0    a,y:(r5)+
  1344.     sub    y0,a    x:(r1)+n1,x1    a,y:(r5)+
  1345.     add    x0,a    x0,y1
  1346.     add    y0,a    x:(r1)+n1,x0    a,y:(r5)+
  1347.     add    x1,a    x1,b
  1348.     add    x0,b    x:(r1)+n1,x1    a,y:(r5)+
  1349.     add    y1,b            b,y:(r5)+
  1350.     add    x1,b    #<2,n5
  1351.     move                b,y:(r5)+
  1352.  
  1353.     movec    #<6-1,m4        ;(modulo-6 addressing)
  1354.     move    r5,r4            ;r4=odd adresses...
  1355.     move    #<2,n4
  1356.     move    (r4)+
  1357.     move    #>imdct_s_tab,r2    ;r2=imdct coefficients
  1358.     move    #<5,n3            ;!;
  1359.     move    r6,r3            ;!;
  1360.  
  1361. ;-- 3. 3pts/6pts idct with twiddle factor for odd indices,
  1362. ;      and output butterflies for 2*3 pts = 6 pts idct
  1363.     move                y:(r4)+n4,y0
  1364.     tfr    y0,b    x:(r2)+,x1    y:(r4)+n4,y1    ;>>> 0.866
  1365.     mac    x1,y1,b    x:(r2)+,x0    y:(r4)+n4,y0    ;>>> 0.5
  1366.     macr    x0,y0,b            y:(r5)+n5,y0
  1367.     tfr    y0,a            y:(r5)+n5,y0
  1368.     mac    x1,y0,a            y:(r5)+n5,y0
  1369.     mac    x0,y0,a    x:(r2)+,x0    b,y0        ;>>> 0.517
  1370.     mpy    x0,y0,b            y:(r4)+n4,y0
  1371.     add    a,b            (r4)+n4        ;>>> 0
  1372.     subl    b,a    r6,r0        ;!;&tmp0b
  1373.     rnd    b    (r3)+n3        ;!;&tmp5b
  1374.     rnd    a    b,x:(r0)+    ;!;y:<tmp0b
  1375.     tfr    y0,b    a,x:(r3)-    ;!;y:<tmp5b
  1376.     move                y:(r4)+n4,y0    ;>>> -1
  1377.     sub    y0,b            y:(r5)+n5,y0
  1378.     tfr    y0,a            (r5)+n5
  1379.     move                y:(r5)+n5,y0
  1380.     sub    y0,a    x:(r2)+,x0    b,y0        ;>>> 0.707
  1381.     mpy    x0,y0,b            y:(r4)+n4,y0
  1382.     add    a,b            y:(r4)+n4,y1    ;>>> -0.866
  1383.     subl    b,a    #<18-1,n1
  1384.     rnd    b    #<2,n0        ;!;
  1385.     rnd    a    b,x:(r0)+    ;!;y:<tmp1b
  1386.     tfr    y0,b    a,x:(r3)    ;!;y:<tmp4b
  1387.     mac    -x1,y1,b x:(r2)+,x0    y:(r4)+n4,y0    ;>>> 0.5
  1388.     macr    x0,y0,b            y:(r5)+n5,y0
  1389.     tfr    y0,a            y:(r5)+n5,y0
  1390.     mac    -x1,y0,a         y:(r5)+n5,y0
  1391.     mac    x0,y0,a    x:(r2)+,x0    b,y0        ;>>> 1.93/2
  1392.     mpy    x0,y0,b    x:(r3)+,y0    ;!;y:<tmp4b
  1393.     addl    a,b    #<5,n4
  1394.     subl    b,a    r6,r4        ;x:<out_adr
  1395.     move        r6,r7
  1396.     movec    m7,m4            ;(linear addressing)
  1397.     rnd    b    x:(r3)-,y1    ;!;y:<tmp5b
  1398.     rnd    a    b,x:(r0)-n0    ;!;y:<tmp2b
  1399.     move        x:(r2),r2            ;imdct_s_tab2_p
  1400.     move        a,x0        ;!;y:<tmp3b
  1401.  
  1402. ;-- 4. twiddle factors, shift to 12pts imdct and multiply by window type 2
  1403. ;    ;r4=&out[ss+6]; n4=-2 ;r2=first coefficient
  1404.     move        x:(r2)+,x1    y:(r4)+,a
  1405.     macr    x1,x0,a    x:(r2)+,x1    y:(r4)+,b
  1406.     move                a,y:(r7)+    ;;;(r4+n4)
  1407.     macr    x1,y0,b    x:(r2)+,x1    y:(r4)+,y0
  1408.     mpyr    x1,y1,a            b,y:(r7)+    ;;;(r4+n4)
  1409.     asl    a    (r1)-n1
  1410.     asl    a    #<3,n1
  1411.     add    y0,a    x:(r2)+,x1    y:(r4)+,y0
  1412.     mpyr    x1,y1,b            a,y:(r7)+    ;;;(r4+n4)
  1413.     asl    b    
  1414.     asl    b    x:(r2)+,x1    y:(r4)+,y1
  1415.     add    y0,b    x:(r3),y0            ;!;y:<tmp4b
  1416.     mpyr    x1,y0,a            b,y:(r7)+    ;;;(r4+n4)
  1417.     asl    a    x:(r2)+,x1    y:(r4)+,b
  1418.     add    y1,a    x:(r0)+,y1            ;!;y:<tmp0b
  1419.     macr    x1,x0,b            a,y:(r7)+    ;;;(r4+n4)
  1420.     move        x:(r2)+,x1    y:(r4)+,a
  1421.     move        x:(r0)+,y0            ;!;y:<tmp1b
  1422.     move        x:(r0),x0            ;!;y:<tmp2b
  1423.     macr    x1,x0,a            b,y:(r7)+    ;;;(r4+n4)
  1424.     move        x:(r2)+,x1    y:(r4)+,b
  1425.     macr    x1,y0,b            a,y:(r7)+    ;;;(r4+n4)
  1426.     move        x:(r2)+,x1    y:(r4)+,a
  1427.     macr    x1,y1,a            b,y:(r7)+    ;;;(r4+n4)
  1428.     move        x:(r2)+,x1    y:(r4)+,b
  1429.     macr    x1,y1,b            a,y:(r7)+    ;;;(r4+n4)
  1430.     move        x:(r2)+,x1    y:(r4)+,a
  1431.     macr    x1,y0,a            b,y:(r7)+    ;;;(r4+n4)
  1432.     move        x:(r2)+,x1    y:(r4)-,b
  1433.     macr    x1,x0,b            a,y:(r4)+
  1434.     move                b,y:(r4)-n4
  1435.     move    r4,r6
  1436. imdct_s_next
  1437.  
  1438. ;-- 5- compute final result for polyphase filter
  1439.     movec    m7,m5            ;(linear addressing)
  1440.     move    n7,r0            ;r0=x:xr[sb]
  1441.     move    x:synth_imfct_p,r5    ;r5=y:out[0]
  1442.     move    n6,r4            ;r4=y:prev[sb][0]
  1443.     move                y:(r5)+,y0
  1444.     jclr    #0,n2,imdct_s_even    ;even or odd subband?
  1445.     move                y:(r4)+,b
  1446.     add    y0,b            y:(r4)+,a
  1447.     move        b,x:(r0)+    y:(r5)+,y1
  1448.     add    y1,a            y:(r4)+,b
  1449.     neg    a            y:(r5)+,y0
  1450.     do    #8,imdct_s_odd_final
  1451.     add    y0,b    a,x:(r0)+    y:(r4)+,a
  1452.     move        b,x:(r0)+    y:(r5)+,y1
  1453.     add    y1,a            y:(r4)+,b
  1454.     neg    a            y:(r5)+,y0
  1455. imdct_s_odd_final
  1456.     move        a,x:(r0)+    y:(r5)-,y0
  1457.     move    n6,r4
  1458.     do    #18,imdct_s_upd_prev
  1459.     move                y:(r5)+,y0
  1460.     move                y0,y:(r4)+
  1461. imdct_s_upd_prev
  1462.     jmp    imdct_s_even_final
  1463. imdct_s_even
  1464.     move    #<17,n5
  1465.     move                y:(r4),b
  1466.     do    #18,imdct_s_even_final
  1467.     add    y0,b            y:(r5+n5),y0
  1468.     move        b,x:(r0)+    y0,y:(r4)+
  1469.     move                y:(r4),b
  1470.     move                y:(r5)+,y0
  1471. imdct_s_even_final
  1472.     move    r0,n7                ;update xr pointer
  1473.     move    r4,n6                ;update prev pointer
  1474.     bchg    #0,n2                ;toggle subband (even/odd)
  1475. imdct_s_loop0
  1476.  
  1477.  
  1478.  
  1479.  
  1480.  
  1481.  
  1482.  
  1483.  
  1484. ;*****************************************************************************
  1485. ;*** synthesis (polyphase filter)
  1486. ;*****************************************************************************
  1487.     move    x:outbuf,r1
  1488.     move    r1,x:synth_out_p
  1489.     move    x:xr_p,r0
  1490.     move    #<$02,a            ;1<<17 = %00000010.00000000.00000000
  1491.  
  1492. synth_loop18_head
  1493.     move    a,x:synth_count18
  1494.     move    r0,x:synth_in_p
  1495.     move    x:synth_imfct_p,n7        ;            !! n7
  1496.  
  1497. ;    ** first butterfly pass
  1498.     move    #<18,n0
  1499.     move    n7,r1                ;x:synth_imfct_p
  1500.     move    n7,r5
  1501.     move    #$39ED1A,y0            ;cos(pi/4) * 1.28/2 = 0.452548339959390415616540391747103
  1502.     ori    #$08,mr                ;SCALE UP mode
  1503.     move            x:(r0)+n0,x0
  1504.     do    #8,synth_bfy1
  1505.     mpyr     x0,y0,a    x:(r0)+n0,x0
  1506.     mpyr    -x0,y0,a    a,x:(r1)+    a,y:(r5)+
  1507.     move            a,x:(r1)+
  1508.     mpyr     x0,y0,a    x:(r0)+n0,x0
  1509.     mpyr    -x0,y0,a    x:(r0)+n0,x0    a,y:(r5)+
  1510.     mpyr     x0,y0,a    a,x:(r1)+    a,y:(r5)+
  1511.     mpyr    -x0,y0,a    a,x:(r1)+
  1512.     move            x:(r0)+n0,x0    a,y:(r5)+
  1513. synth_bfy1
  1514.     andi    #$f3,mr                ;NO SCALING mode
  1515.  
  1516. ;    ** second butterfly pass
  1517.     clr    b    n7,a            ;x:synth_imfct_p
  1518.     move    #<16,b1
  1519.     add    b,a    a,r0
  1520.     add    b,a    a,r4
  1521.     add    b,a    a,r6
  1522.     move        a,r5
  1523.     lua    (r0)+,r7
  1524.     move            x:(r0),b    y:(r4),y0
  1525.     do    #16,synth_bfy2
  1526.     add    y0,b        x:(r4),x1    y:(r0),a
  1527.     sub    x1,a        b,x:(r5)    y:(r0),b
  1528.     add    x1,b        x:(r0),a    a,y:(r5)+
  1529.     sub    y0,a        x:(r0),b    b,y:(r6)
  1530.     sub    x1,b        a,x:(r6)+    y:(r0),a
  1531.     sub    y0,a        b,x:(r4)    y:(r0),b
  1532.     add    y0,b        x:(r0),a    a,y:(r4)+
  1533.     add    x1,a        x:(r7)+,b    b,y:(r0)    ;!b
  1534.     move            a,x:(r0)+    y:(r4),y0    ;!y0
  1535. synth_bfy2
  1536.  
  1537.     ori    #$08,mr                ;SCALE UP mode
  1538. ;this nice feature allows us to automatically scale up the samples during
  1539. ;the next processing steps, so we can save the ASL's in the final loop which
  1540. ;writes PCM samples to the output buffer (we need to shift left by 6 bits)
  1541.  
  1542.  
  1543. ;    ** perform the rest of the butterfly passes
  1544.     move    x:synth_tab_rsincosx_p,n6    ;x:synth_tab_rsincosx_p    !! n6
  1545.     move    n7,r0                ;x:synth_imfct_p
  1546.     movec    #<64-1,m0            ;modulo-64 addressing
  1547.     movec    #<64-1,m4            ;modulo-64 addressing
  1548.  
  1549. ;    ** pass 3  - SCALE UP (1/6)
  1550.     move    n6,r6                ;x:synth_tab_rsincosx_p
  1551.     move    #<8,n0
  1552.     move    #<8,n4
  1553.     move    r0,r4
  1554.     do    #4,synth_grp3
  1555.     lua    (r0)+n0,r5
  1556.     move    r5,r2
  1557.     move            x:(r6),x0
  1558.     move            x:(r0),b    y:(r5),y1
  1559.     mac    -x0,y1,b    x:(r2)+,x1    y:(r6)+,y0
  1560.     do    #8,synth_bfy3
  1561.     macr    y0,x1,b        x:(r0),a
  1562.     subl    b,a        b,x:(r0)    y:(r4)+,b
  1563.     mac    y0,y1,b        a,x:(r5)    y:(r2),y1
  1564.     macr    x0,x1,b                y:(r0),a
  1565.     subl    b,a        x:(r4),b    b,y:(r0)+
  1566.     mac    -x0,y1,b    x:(r2)+,x1    a,y:(r5)+
  1567. synth_bfy3
  1568.     move            x:(r0)+n0,x0    y:(r4)+n4,y0    ;update r0, r4
  1569. synth_grp3
  1570.  
  1571.     movec    #<64-1,m2            ;modulo-64 addressing
  1572.     movec    #<64-1,m5            ;modulo-64 addressing
  1573.  
  1574. ;    ** pass 4  - SCALE UP (2/6)
  1575.     move    n6,r6                ;x:synth_tab_rsincosx_p
  1576.     move    #<4+0,n0
  1577.     move    #<4+1,n2
  1578.     move    #<4+1,n4
  1579.     move    #<4+1,n5
  1580.     lua    (r0)+n0,r5
  1581.     move    r5,r2
  1582.     move            x:(r6),x0
  1583.     move            x:(r0),b    y:(r5),y1
  1584.     do    #8,synth_grp4
  1585.     mac    -x0,y1,b    x:(r2)+,x1    y:(r6)+,y0
  1586.     macr    y0,x1,b        x:(r0),a
  1587.     subl    b,a        b,x:(r0)    y:(r4)+,b
  1588.     mac    y0,y1,b        a,x:(r5)    y:(r2),y1
  1589.     macr    x0,x1,b                y:(r0),a
  1590.     subl    b,a        x:(r4),b    b,y:(r0)+
  1591.     mac    -x0,y1,b    x:(r2)+,x1    a,y:(r5)+
  1592.     macr    y0,x1,b        x:(r0),a
  1593.     subl    b,a        b,x:(r0)    y:(r4)+,b
  1594.     mac    y0,y1,b        a,x:(r5)    y:(r2),y1
  1595.     macr    x0,x1,b                y:(r0),a
  1596.     subl    b,a        x:(r4),b    b,y:(r0)+
  1597.     mac    -x0,y1,b    x:(r2)+,x1    a,y:(r5)+
  1598.     macr    y0,x1,b        x:(r0),a
  1599.     subl    b,a        b,x:(r0)    y:(r4)+,b
  1600.     mac    y0,y1,b        a,x:(r5)    y:(r2),y1
  1601.     macr    x0,x1,b                y:(r0),a
  1602.     subl    b,a        x:(r4),b    b,y:(r0)+
  1603.     mac    -x0,y1,b    x:(r2)+n2,x1    a,y:(r5)+    ;update r2
  1604.     macr    y0,x1,b        x:(r0),a
  1605.     subl    b,a        b,x:(r0)    y:(r4)+n4,b    ;update r4
  1606.     mac    y0,y1,b        a,x:(r5)    y:(r2),y1    ;!y1
  1607.     macr    x0,x1,b        x:(r6),x0    y:(r0),a    ;!x0
  1608.     subl    b,a        x:(r4),b    b,y:(r0)+    ;!b
  1609.     move            x:(r0)+n0,a    a,y:(r5)+n5    ;update r0, r5
  1610. synth_grp4
  1611.  
  1612. ;    ** pass 5  - SCALE UP (3/6)
  1613.     move    n6,r6                ;x:synth_tab_rsincosx_p
  1614.     move    #<2+0,n0
  1615.     move    #<2+1,n2
  1616.     move    #<2+1,n4
  1617.     move    #<2+1,n5
  1618.     lua    (r0)+n0,r5
  1619.     move    r5,r2
  1620.     move            x:(r6),x0
  1621.     move            x:(r0),b    y:(r5),y1
  1622.     do    #16,synth_grp5
  1623.     mac    -x0,y1,b    x:(r2)+,x1    y:(r6)+,y0
  1624.     macr    y0,x1,b        x:(r0),a
  1625.     subl    b,a        b,x:(r0)    y:(r4)+,b
  1626.     mac    y0,y1,b        a,x:(r5)    y:(r2),y1
  1627.     macr    x0,x1,b                y:(r0),a
  1628.     subl    b,a        x:(r4),b    b,y:(r0)+
  1629.     mac    -x0,y1,b    x:(r2)+n2,x1    a,y:(r5)+    ;update r2
  1630.     macr    y0,x1,b        x:(r0),a
  1631.     subl    b,a        b,x:(r0)    y:(r4)+n4,b    ;update r4
  1632.     mac    y0,y1,b        a,x:(r5)    y:(r2),y1    ;!y1
  1633.     macr    x0,x1,b        x:(r6),x0    y:(r0),a    ;!x0
  1634.     subl    b,a        x:(r4),b    b,y:(r0)+    ;!b
  1635.     move            x:(r0)+n0,a    a,y:(r5)+n5    ;update r0, r5
  1636. synth_grp5
  1637.  
  1638. ;    ** pass 6  - SCALE UP (4/6)
  1639.     move    n6,r6                ;x:synth_tab_rsincosx_p
  1640.     move    #<1+1,n2
  1641.     move    #<1+1,n4
  1642.     move    #<1+1,n5
  1643.     lua    (r0)+,r5
  1644.     move    r5,r2
  1645.     move            x:(r6),x0
  1646.     move            x:(r0),b    y:(r5),y1
  1647.     do    #32,synth_grp6
  1648.     mac    -x0,y1,b    x:(r2)+n2,x1    y:(r6)+,y0    ;update r2
  1649.     macr    y0,x1,b        x:(r0),a
  1650.     subl    b,a        b,x:(r0)    y:(r4)+n4,b    ;update r4
  1651.     mac    y0,y1,b        a,x:(r5)    y:(r2),y1    ;!y1
  1652.     macr    x0,x1,b        x:(r6),x0    y:(r0),a    ;!x0
  1653.     subl    b,a        x:(r4),b    b,y:(r0)+    ;!b
  1654.     move            x:(r0)+,a    a,y:(r5)+n5    ;update r0, r5
  1655. synth_grp6
  1656.  
  1657.     movec    m7,m2                ;linear addressing
  1658.     movec    m7,m4                ;linear addressing
  1659.     movec    m7,m5                ;linear addressing
  1660.  
  1661. ;    ** unscrambling and final adjustments  - SCALE UP (5/6)
  1662.     move    x:synth_audio_pp,r5
  1663.     move    #>synth_tab_cosx,r4
  1664.     move    #>synth_tab_sinx,r6
  1665.     move    x:(r5),r5
  1666.     movec    #<0,m0                ;bit-reverse addressing
  1667.     move    #<32,n0
  1668.     move            x:(r0),x1    y:(r4)+,y1
  1669.     mpy    y1,x1,a                y:(r6)+,y0
  1670.     move                    y:(r0)+n0,y1
  1671.     macr    -y0,y1,a    x:(r0),x1    y:(r4)+,y1
  1672.     move                    y:(r6)+,y0
  1673. synth_unscramble_start
  1674. ;------    move    #synth_unscramble,r7
  1675. ;------    jmp    <synth_unscramble_start
  1676.     do    #64-1,synth_unscramble
  1677.     mpy    y1,x1,a        a,x:(r5)+    y:(r0)+n0,y1
  1678.     macr    -y0,y1,a    x:(r0),x1    y:(r4)+,y1
  1679.     move                    y:(r6)+,y0
  1680. synth_unscramble
  1681. ;------    5+1 words, return: jmp (r7)
  1682.     move            a,x:(r5)+
  1683.  
  1684. ;    ** window audio data - output PCM samples  - SCALE UP (6/6)
  1685.     move    x:synth_out_p,r6
  1686.     move    x:channel_counter,b
  1687.     move    x:channels,x0
  1688.     sub    x0,b    n7,r5            ;x:synth_imfct_p
  1689.     teq    b,a    r6,r5            ;outbuf (x:-mem, left ch.)
  1690.  
  1691.     move    x:synth_audio_pp,r0
  1692.     movec    #1024-1,m0            ;modulo addressing
  1693.     movec    m0,m1                ;modulo addressing
  1694.     move    x:(r0),r0
  1695.     move    #<96,n0
  1696.     move    #>synth_tab_window,r4
  1697.     lua    (r0)+n0,r1
  1698.     move    x:synth_window_p,r3
  1699.     move    #<128,n0
  1700.     move    #<128,n1
  1701.     jsr    (r3)                ;write to left channel (or tmp)
  1702.  
  1703.     andi    #$f3,mr                ;NO SCALING mode
  1704.  
  1705.     tst    b    n7,r3            ;x:synth_imfct_p
  1706.     jeq    synth_out_done
  1707.     move    r6,r5                ;outbuf (y:-mem, right ch.)
  1708.     move    x:(r3)+,a
  1709.     rep    #32                ;(copy from tmp)
  1710.     move    x:(r3)+,a    a,y:(r5)+    ;write to right channel
  1711. synth_out_done
  1712.     move    r5,x:synth_out_p
  1713.  
  1714. ;    ** update audio buffer pointer
  1715.     move    x:synth_audio_pp,r1
  1716.     move    #<64,n0
  1717.     move    x:(r1),r0
  1718.     movec    m7,m1                ;linear addressing
  1719.     move    (r0)-n0
  1720.     movec    m7,m0                ;linear addressing
  1721.     move    r0,x:(r1)
  1722.  
  1723. ;    ** loop 18 times
  1724.     move    x:synth_in_p,r0
  1725.     move    x:synth_count18,a
  1726.     lsr    a    (r0)+
  1727.     jne    synth_loop18_head
  1728.  
  1729.  
  1730.  
  1731.     move    x:si_tab_p,r0
  1732.     move    #>xr1,r1
  1733.     move    #>hybrid_prev1,r2
  1734.     move    #>synth_audio_r_p,r3
  1735.     clr    b    y:forcemono,x0
  1736.     cmp    x0,b    x:channel_counter,a
  1737.     tne    b,a
  1738.     lsr    a    (r0)+
  1739.     jne    hybrid_synth_channel_loop    ;next channel
  1740.  
  1741. ;****** for(ch=0;ch<stereo;ch++)    ;end************************
  1742.  
  1743.  
  1744.     move    x:outbuf,r1
  1745.     move    #576,n1
  1746.     move    #>si_tab+2,r0
  1747.     move    #>granule1_sfsi,n0
  1748.     move    (r1)+n1
  1749.     move    x:granule_counter,a
  1750.     tst    a    #<1,a
  1751.     jeq    decode_granule_loop    ;decode second granule
  1752.  
  1753. ;****** for(gr=0;gr<ngr;gr++)        ;end************************
  1754.  
  1755.  
  1756.  
  1757.  
  1758. ;    do    #500,overload0
  1759. ;    do    #1000,overload1
  1760. ;    nop
  1761. ;overload1
  1762. ;    nop
  1763. ;overload0
  1764.  
  1765.     move    #<0,x0
  1766.     move    x0,y:busy        ;clear BUSY
  1767.     rts                ;it's done.
  1768.  
  1769.  
  1770.  
  1771.  
  1772.  
  1773.  
  1774.  
  1775.  
  1776.  
  1777.  
  1778. synth_window_start
  1779.     do    #32,synth_window
  1780.     move            x:(r0)+n0,x0    y:(r4)+,y0
  1781.     mpy    x0,y0,a        x:(r1)+n1,x0    y:(r4)+,y0
  1782.     mac    x0,y0,a        x:(r0)+n0,x0    y:(r4)+,y0
  1783.     mac    x0,y0,a        x:(r1)+n1,x0    y:(r4)+,y0
  1784.     mac    x0,y0,a        x:(r0)+n0,x0    y:(r4)+,y0
  1785.     mac    x0,y0,a        x:(r1)+n1,x0    y:(r4)+,y0
  1786.     mac    x0,y0,a        x:(r0)+n0,x0    y:(r4)+,y0
  1787.     mac    x0,y0,a        x:(r1)+n1,x0    y:(r4)+,y0
  1788.     mac    x0,y0,a        x:(r0)+n0,x0    y:(r4)+,y0
  1789.     mac    x0,y0,a        x:(r1)+n1,x0    y:(r4)+,y0
  1790.     mac    x0,y0,a        x:(r0)+n0,x0    y:(r4)+,y0
  1791.     mac    x0,y0,a        x:(r1)+n1,x0    y:(r4)+,y0
  1792.     mac    x0,y0,a        x:(r0)+n0,x0    y:(r4)+,y0
  1793.     mac    x0,y0,a        x:(r1)+n1,x0    y:(r4)+,y0
  1794.     mac    x0,y0,a        x:(r0)+n0,x0    y:(r4)+,y0
  1795.     mac    x0,y0,a        x:(r1)+n1,x0    y:(r4)+,y0
  1796.     macr    x0,y0,a        (r0)+
  1797.     move            a,x:(r5)+    y:(r1)+,a    ;update r1
  1798. synth_window
  1799.     rts
  1800. synth_window_end
  1801. ;        ** 21 words
  1802.  
  1803.  
  1804. getbits_init
  1805.     clr    b    r7,x:getbits_stream
  1806.     move    b,x:getbits_count
  1807.     move    #<$80,b            ;end marker
  1808.     move    b,x:getbits_temp
  1809. getbits_continue
  1810.     move    x:getbits_p,r5        ;getbits(n7) -> jsr (r5)
  1811.     clr    b    x:getbit1_p,r6    ;getbit1()   -> jsr (r6)
  1812.     move    x:getbits_stream,r7    ;!! DO NOT TOUCH !!
  1813.     move    x:getbits_temp,b1    ;!! DO NOT TOUCH !!
  1814.     move    x:getbits_count,b0    ;!! DO NOT TOUCH !!
  1815.     rts
  1816.  
  1817. getbits_pause
  1818.     move    r7,x:getbits_stream
  1819.     move    b1,x:getbits_temp
  1820.     move    b0,x:getbits_count
  1821.     rts
  1822.  
  1823. getbits__
  1824.     do    n7,getbits_loop        ;n7=number_of_bits
  1825.     inc    b            ;b0=b0+1  (increment bit counter)
  1826.     lsl    b            ;b1=b1<<1 (new CARRY bit)
  1827.     jne    getbits_ne
  1828.     move    x:(r7)+,b1        ;fetch next 24 bits
  1829.     rol    b            ;b1=b1<<1, append end marker
  1830. getbits_ne
  1831.     rol    a            ;get CARRY bit, set condition code ZERO
  1832. getbits_loop
  1833.     rts
  1834.  
  1835. getbit1__
  1836.     inc    b            ;b0=b0+1  (increment bit counter)
  1837.     lsl    b    #<0,a        ;b1=b1<<1 (new CARRY bit)
  1838.     jne    getbit1_ne
  1839.     move    x:(r7)+,b1        ;fetch next 24 bits
  1840.     rol    b            ;b1=b1<<1, append end marker
  1841. getbit1_ne
  1842.     rol    a            ;get CARRY bit, set condition code ZERO
  1843.     rts
  1844.  
  1845.  
  1846.  
  1847.  
  1848.  
  1849.  
  1850.  
  1851.  
  1852.  
  1853.  
  1854.  
  1855.  
  1856. ;*****************************************************************************
  1857. ;*** initialize
  1858. ;*****************************************************************************
  1859. ; parameters
  1860. ;  x1 - mem_mp3 (64+32+30=126 words in INTERNAL L-memory)
  1861. ;  x0 - mem_mp3p (21+6=27 words in INTERNAL P-memory)
  1862. ;  y1 - freq_idx (0, 1 or 2 - extracted from frame header)
  1863. ;  y0 - /
  1864. init
  1865.     clr    b
  1866.  
  1867. ;********* hybrid filter + synthesis: fast L-data buffer
  1868. ;********* (64 words - major speedup!!)
  1869.     tfr    x1,a        #<64,b1
  1870.     tst    a        #>synth_tab_rsinxrcosx,r0
  1871.     jeq    init_no_lmem
  1872.     add    b,a        a,x:synth_imfct_p
  1873.  
  1874. ;********* synthesis: rsinx_rcosx table to fast L-data memory
  1875. ;********* (32 words - little speedup)
  1876.     move    a,x:synth_tab_rsincosx_p
  1877.     move    a,r4
  1878.     move    x:(r0),a
  1879.     do    #32,init_loop_l0
  1880.     move    a,x:(r4)    y:(r0)+,a
  1881.     move    x:(r0),a    a,y:(r4)+
  1882. init_loop_l0
  1883.  
  1884. ;********* hybrid filter: imdct_l_tab2 to fast X-data memory
  1885. ;********* (18 words - tiny speedup)
  1886.     move    #>imdct_l_tab2_p,r0
  1887.     move    r4,r1            ;r1=32 words fast Y-mem pointer
  1888.     move    r4,x:(r0)+
  1889.     move    #>imdct_s_tab2_p,r2    ;next...
  1890.     do    #18,init_loop_l1
  1891.     move    x:(r0)+,a
  1892.     move    a,x:(r4)+
  1893. init_loop_l1
  1894.  
  1895. ;********* hybrid filter: imdct_s_tab2 to fast X-data memory
  1896. ;********* (12 words - tiny speedup)
  1897.     move    r4,x:(r2)+
  1898.     move    #>cs_ca_tab_p,r0    ;next...
  1899.     do    #12,init_loop_l2
  1900.     move    x:(r2)+,a
  1901.     move    a,x:(r4)+
  1902. init_loop_l2
  1903.  
  1904. ;********* hybrid filter: cs_ca_tab to fast Y-data memory
  1905. ;********* (16 words - tiny speedup)
  1906.     move    x:(r0),r2
  1907.     move    r1,x:(r0)
  1908.     do    #16,init_loop_l3    ;14 words Y-mem remain unused...
  1909.     move    y:(r2)+,a
  1910.     move    a,y:(r1)+
  1911. init_loop_l3
  1912.  
  1913.  
  1914.  
  1915. init_no_lmem
  1916.     tfr    x0,a        #synth_window_start,r0
  1917.     tst    a        x0,r1
  1918.     jeq    init_no_pmem
  1919.  
  1920. ;********* synthesis: window loop to fast program memory
  1921. ;********* (21 words - major speedup!!)
  1922.     move    x0,x:synth_window_p
  1923.     lua    (r1)+,r2
  1924.     do    #synth_window_end-synth_window_start,init_loop_p0
  1925.     movem    p:(r0)+,x1
  1926.     movem    x1,p:(r1)+
  1927. init_loop_p0
  1928.     tfr    x0,a        #>synth_window-synth_window_start-1,x0
  1929.     add    x0,a        #>synth_unscramble_start,r0
  1930.     movem    a,p:(r2)
  1931.  
  1932. ;********* synthesis: unscramble loop to fast program memory
  1933. ;********* (6 words - tiny speedup)
  1934.     move    r1,a
  1935.     tfr    a,b        r0,r2
  1936.     movem    p:(r0)+,x1
  1937.     movem    x1,p:(r1)+        ;copy first word of 'do'
  1938.     move    #>synth_unscramble-synth_unscramble_start-1,x0
  1939.     add    x0,a        (r0)+
  1940.     movem    a,p:(r1)+        ;second word of 'do' (absolute address)
  1941.     do    #synth_unscramble-synth_unscramble_start-2,init_loop_p1
  1942.     movem    p:(r0)+,x1
  1943.     movem    x1,p:(r1)+        ;copy the rest
  1944. init_loop_p1
  1945.     move    #>synth_unscramble_help,r3
  1946.     move    #>$0c0000,y0        ;short jump 'jmp xxx'
  1947.     movem    p:(r3)+,x1
  1948.     movem    x1,p:(r1)+        ;copy 'jmp (r7)'
  1949.     movem    p:(r3)+,x1
  1950.     movem    x1,p:(r2)+
  1951.     movem    p:(r3),x1
  1952.     movem    x1,p:(r2)+        ;copy 'move #synth_unscramble,r7'
  1953.     or    y0,b
  1954.     movem    b,p:(r2)        ;short jump 'jmp <synth_unscramble_start'
  1955.  
  1956.  
  1957.  
  1958.  
  1959.  
  1960. init_no_pmem
  1961. ;****** select scalefactor_band tables (using freq_idx)
  1962.     move    y1,n0            ;freq_idx
  1963.     move    #>sfbands_tab,r0
  1964.     nop
  1965.     move    x:(r0+n0),a
  1966.     move    #>sfbandl_tab,r0
  1967.     move    a,x:sfbands_p
  1968.     move    a,r1
  1969.     move    x:(r0+n0),a
  1970.     move    a,x:sfbandl_p
  1971.  
  1972.     move    #<0,x0
  1973.     rts
  1974.  
  1975.  
  1976.  
  1977. synth_unscramble_help
  1978.     jmp    (r7)
  1979.     move    #synth_unscramble,r7
  1980.  
  1981.  
  1982.  
  1983.  
  1984.  
  1985.  
  1986.  
  1987.  
  1988.  
  1989.  
  1990.  
  1991.  
  1992.     org    x:
  1993.     align    1024
  1994. synth_audio
  1995.     ds    2048
  1996.  
  1997. ;->xdata+2048
  1998. inbuf
  1999.     ds    662    ;(33+512+1440)/3
  2000.  
  2001.  
  2002.  
  2003. ;    dc    "***xr0***"
  2004. xr0        ds    576
  2005. ;    dc    "***xr1***"
  2006.         dc    1,1,1    ;safety (for INTENSITY STEREO)
  2007. xr1        ds    576
  2008. ;    dc    "***xr.***"
  2009. xr_p        ds    1
  2010. xr_zero_p    ds    1
  2011.  
  2012.  
  2013. ;    dc    "***getbit***"
  2014. getbits_p        dc    getbits__
  2015. getbit1_p        dc    getbit1__
  2016. getbits_stream        ds    1
  2017. getbits_temp        ds    1
  2018. getbits_count        ds    1
  2019.  
  2020. mono            ds    1
  2021. channels        ds    1
  2022. modext            ds    1
  2023.  
  2024. ;    dc    "************  is  ************"
  2025. x_is_nonzero        dc    0
  2026.  
  2027.  
  2028. sfsi_p        ds    1
  2029. granule0_sfsi    ds    4*2    ;always zero
  2030. ;    dc    "***sfsi01***"
  2031. granule1_sfsi    ds    4*2    ;4 values for each channel
  2032.  
  2033. si_granule_tab_p    ds    1
  2034. si_tab_p        ds    1
  2035. si_tab        dc    si0,si1,si2,si3
  2036.  
  2037. ;    dc    "***si0***"
  2038. si0
  2039. grstart        ds    1
  2040. grend        ds    1
  2041. regionend2    ds    1
  2042. globalgain    ds    1
  2043. sfcompress    ds    1
  2044. blocktype    ds    1
  2045. mixedblock    ds    1
  2046. tabsel0        ds    1
  2047. tabsel1        ds    1
  2048. tabsel2        ds    1
  2049. subblockgain0    ds    1
  2050. subblockgain1    ds    1
  2051. subblockgain2    ds    1
  2052. regionend0    ds    1
  2053. regionend1    ds    1
  2054. preflag        ds    1
  2055. sfshift        ds    1
  2056. tabsel3        ds    1
  2057. ;    dc    "***si1***"
  2058. si1        ds    18
  2059. ;    dc    "***si2***"
  2060. si2        ds    18
  2061. ;    dc    "***si3***"
  2062. si3        ds    18
  2063. ;    dc    "***si.***"
  2064.  
  2065. granule_counter    ds    1
  2066. channel_counter    ds    1
  2067.  
  2068. outbuf        ds    1
  2069.  
  2070. scalefac_p    ds    1
  2071. ;    dc    "***sf0***"
  2072. scalefac0    ds    39
  2073. ;    dc    "***sf1***"
  2074. scalefac1    ds    39
  2075. ;    dc    "***sf.***"
  2076.  
  2077.  
  2078. prev_p        ds    1
  2079.  
  2080. synth_in_p        ds    1
  2081. synth_out_p        ds    1
  2082. ;    dc    "**synth**"
  2083. synth_audio_l_p        dc    synth_audio
  2084. synth_audio_r_p        dc    synth_audio+1024
  2085. synth_audio_pp        ds    1
  2086. synth_count18        ds    1
  2087.  
  2088. synth_imfct_p        dc    synth_imfct_slow
  2089. synth_window_p        dc    synth_window_start
  2090. synth_tab_rsincosx_p    dc    synth_tab_rsinxrcosx
  2091.  
  2092.  
  2093.  
  2094. htab00
  2095. htab04
  2096. htab14
  2097.  dc    0
  2098. htab01
  2099.  dc   -5,  -3,  -1,  17,   1,  16,   0
  2100. htab02
  2101.  dc  -15, -11,  -9,  -5,  -3,  -1,  34,   2,  18,  -1,  33,  32,  17,  -1,   1
  2102.  dc   16,   0
  2103. htab03
  2104.  dc  -13, -11,  -9,  -5,  -3,  -1,  34,   2,  18,  -1,  33,  32,  16,  17,  -1
  2105.  dc    1,   0
  2106. htab05
  2107.  dc  -29, -25, -23, -15,  -7,  -5,  -3,  -1,  51,  35,  50,  49,  -3,  -1,  19
  2108.  dc    3,  -1,  48,  34,  -3,  -1,  18,  33,  -1,   2,  32,  17,  -1,   1,  16
  2109.  dc    0
  2110. htab06
  2111.  dc  -25, -19, -13,  -9,  -5,  -3,  -1,  51,   3,  35,  -1,  50,  48,  -1,  19
  2112.  dc   49,  -3,  -1,  34,   2,  18,  -3,  -1,  33,  32,   1,  -1,  17,  -1,  16
  2113.  dc    0
  2114. htab07
  2115.  dc  -69, -65, -57, -39, -29, -17, -11,  -7,  -3,  -1,  85,  69,  -1,  84,  83
  2116.  dc   -1,  53,  68,  -3,  -1,  37,  82,  21,  -5,  -1,  81,  -1,   5,  52,  -1
  2117.  dc   80,  -1,  67,  51,  -5,  -3,  -1,  36,  66,  20,  -1,  65,  64, -11,  -7
  2118.  dc   -3,  -1,   4,  35,  -1,  50,   3,  -1,  19,  49,  -3,  -1,  48,  34,  18
  2119.  dc   -5,  -1,  33,  -1,   2,  32,  17,  -1,   1,  16,   0
  2120. htab08
  2121.  dc  -65, -63, -59, -45, -31, -19, -13,  -7,  -5,  -3,  -1,  85,  84,  69,  83
  2122.  dc   -3,  -1,  53,  68,  37,  -3,  -1,  82,   5,  21,  -5,  -1,  81,  -1,  52
  2123.  dc   67,  -3,  -1,  80,  51,  36,  -5,  -3,  -1,  66,  20,  65,  -3,  -1,   4
  2124.  dc   64,  -1,  35,  50,  -9,  -7,  -3,  -1,  19,  49,  -1,   3,  48,  34,  -1
  2125.  dc    2,  32,  -1,  18,  33,  17,  -3,  -1,   1,  16,   0
  2126. htab09
  2127.  dc  -63, -53, -41, -29, -19, -11,  -5,  -3,  -1,  85,  69,  53,  -1,  83,  -1
  2128.  dc   84,   5,  -3,  -1,  68,  37,  -1,  82,  21,  -3,  -1,  81,  52,  -1,  67
  2129.  dc   -1,  80,   4,  -7,  -3,  -1,  36,  66,  -1,  51,  64,  -1,  20,  65,  -5
  2130.  dc   -3,  -1,  35,  50,  19,  -1,  49,  -1,   3,  48,  -5,  -3,  -1,  34,   2
  2131.  dc   18,  -1,  33,  32,  -3,  -1,  17,   1,  -1,  16,   0
  2132. htab10
  2133.  dc -125,-121,-111, -83, -55, -35, -21, -13,  -7,  -3,  -1, 119, 103,  -1, 118
  2134.  dc   87,  -3,  -1, 117, 102,  71,  -3,  -1, 116,  86,  -1, 101,  55,  -9,  -3
  2135.  dc   -1, 115,  70,  -3,  -1,  85,  84,  99,  -1,  39, 114, -11,  -5,  -3,  -1
  2136.  dc  100,   7, 112,  -1,  98,  -1,  69,  53,  -5,  -1,   6,  -1,  83,  68,  23
  2137.  dc  -17,  -5,  -1, 113,  -1,  54,  38,  -5,  -3,  -1,  37,  82,  21,  -1,  81
  2138.  dc   -1,  52,  67,  -3,  -1,  22,  97,  -1,  96,  -1,   5,  80, -19, -11,  -7
  2139.  dc   -3,  -1,  36,  66,  -1,  51,   4,  -1,  20,  65,  -3,  -1,  64,  35,  -1
  2140.  dc   50,   3,  -3,  -1,  19,  49,  -1,  48,  34,  -7,  -3,  -1,  18,  33,  -1
  2141.  dc    2,  32,  17,  -1,   1,  16,   0
  2142. htab11
  2143.  dc -121,-113, -89, -59, -43, -27, -17,  -7,  -3,  -1, 119, 103,  -1, 118, 117
  2144.  dc   -3,  -1, 102,  71,  -1, 116,  -1,  87,  85,  -5,  -3,  -1,  86, 101,  55
  2145.  dc   -1, 115,  70,  -9,  -7,  -3,  -1,  69,  84,  -1,  53,  83,  39,  -1, 114
  2146.  dc   -1, 100,   7,  -5,  -1, 113,  -1,  23, 112,  -3,  -1,  54,  99,  -1,  96
  2147.  dc   -1,  68,  37, -13,  -7,  -5,  -3,  -1,  82,   5,  21,  98,  -3,  -1,  38
  2148.  dc    6,  22,  -5,  -1,  97,  -1,  81,  52,  -5,  -1,  80,  -1,  67,  51,  -1
  2149.  dc   36,  66, -15, -11,  -7,  -3,  -1,  20,  65,  -1,   4,  64,  -1,  35,  50
  2150.  dc   -1,  19,  49,  -5,  -3,  -1,   3,  48,  34,  33,  -5,  -1,  18,  -1,   2
  2151.  dc   32,  17,  -3,  -1,   1,  16,   0
  2152. htab12
  2153.  dc -115, -99, -73, -45, -27, -17,  -9,  -5,  -3,  -1, 119, 103, 118,  -1,  87
  2154.  dc  117,  -3,  -1, 102,  71,  -1, 116, 101,  -3,  -1,  86,  55,  -3,  -1, 115
  2155.  dc   85,  39,  -7,  -3,  -1, 114,  70,  -1, 100,  23,  -5,  -1, 113,  -1,   7
  2156.  dc  112,  -1,  54,  99, -13,  -9,  -3,  -1,  69,  84,  -1,  68,  -1,   6,   5
  2157.  dc   -1,  38,  98,  -5,  -1,  97,  -1,  22,  96,  -3,  -1,  53,  83,  -1,  37
  2158.  dc   82, -17,  -7,  -3,  -1,  21,  81,  -1,  52,  67,  -5,  -3,  -1,  80,   4
  2159.  dc   36,  -1,  66,  20,  -3,  -1,  51,  65,  -1,  35,  50, -11,  -7,  -5,  -3
  2160.  dc   -1,  64,   3,  48,  19,  -1,  49,  34,  -1,  18,  33,  -7,  -5,  -3,  -1
  2161.  dc    2,  32,   0,  17,  -1,   1,  16,   0
  2162. htab13
  2163.  dc -509,-503,-475,-405,-333,-265,-205,-153,-115, -83, -53, -35, -21, -13,  -9
  2164.  dc   -7,  -5,  -3,  -1, 254, 252, 253, 237, 255,  -1, 239, 223,  -3,  -1, 238
  2165.  dc  207,  -1, 222, 191,  -9,  -3,  -1, 251, 206,  -1, 220,  -1, 175, 233,  -1
  2166.  dc  236, 221,  -9,  -5,  -3,  -1, 250, 205, 190,  -1, 235, 159,  -3,  -1, 249
  2167.  dc  234,  -1, 189, 219, -17,  -9,  -3,  -1, 143, 248,  -1, 204,  -1, 174, 158
  2168.  dc   -5,  -1, 142,  -1, 127, 126, 247,  -5,  -1, 218,  -1, 173, 188,  -3,  -1
  2169.  dc  203, 246, 111, -15,  -7,  -3,  -1, 232,  95,  -1, 157, 217,  -3,  -1, 245
  2170.  dc  231,  -1, 172, 187,  -9,  -3,  -1,  79, 244,  -3,  -1, 202, 230, 243,  -1
  2171.  dc   63,  -1, 141, 216, -21,  -9,  -3,  -1,  47, 242,  -3,  -1, 110, 156,  15
  2172.  dc   -5,  -3,  -1, 201,  94, 171,  -3,  -1, 125, 215,  78, -11,  -5,  -3,  -1
  2173.  dc  200, 214,  62,  -1, 185,  -1, 155, 170,  -1,  31, 241, -23, -13,  -5,  -1
  2174.  dc  240,  -1, 186, 229,  -3,  -1, 228, 140,  -1, 109, 227,  -5,  -1, 226,  -1
  2175.  dc   46,  14,  -1,  30, 225, -15,  -7,  -3,  -1, 224,  93,  -1, 213, 124,  -3
  2176.  dc   -1, 199,  77,  -1, 139, 184,  -7,  -3,  -1, 212, 154,  -1, 169, 108,  -1
  2177.  dc  198,  61, -37, -21,  -9,  -5,  -3,  -1, 211, 123,  45,  -1, 210,  29,  -5
  2178.  dc   -1, 183,  -1,  92, 197,  -3,  -1, 153, 122, 195,  -7,  -5,  -3,  -1, 167
  2179.  dc  151,  75, 209,  -3,  -1,  13, 208,  -1, 138, 168, -11,  -7,  -3,  -1,  76
  2180.  dc  196,  -1, 107, 182,  -1,  60,  44,  -3,  -1, 194,  91,  -3,  -1, 181, 137
  2181.  dc   28, -43, -23, -11,  -5,  -1, 193,  -1, 152,  12,  -1, 192,  -1, 180, 106
  2182.  dc   -5,  -3,  -1, 166, 121,  59,  -1, 179,  -1, 136,  90, -11,  -5,  -1,  43
  2183.  dc   -1, 165, 105,  -1, 164,  -1, 120, 135,  -5,  -1, 148,  -1, 119, 118, 178
  2184.  dc  -11,  -3,  -1,  27, 177,  -3,  -1,  11, 176,  -1, 150,  74,  -7,  -3,  -1
  2185.  dc   58, 163,  -1,  89, 149,  -1,  42, 162, -47, -23,  -9,  -3,  -1,  26, 161
  2186.  dc   -3,  -1,  10, 104, 160,  -5,  -3,  -1, 134,  73, 147,  -3,  -1,  57,  88
  2187.  dc   -1, 133, 103,  -9,  -3,  -1,  41, 146,  -3,  -1,  87, 117,  56,  -5,  -1
  2188.  dc  131,  -1, 102,  71,  -3,  -1, 116,  86,  -1, 101, 115, -11,  -3,  -1,  25
  2189.  dc  145,  -3,  -1,   9, 144,  -1,  72, 132,  -7,  -5,  -1, 114,  -1,  70, 100
  2190.  dc   40,  -1, 130,  24, -41, -27, -11,  -5,  -3,  -1,  55,  39,  23,  -1, 113
  2191.  dc   -1,  85,   7,  -7,  -3,  -1, 112,  54,  -1,  99,  69,  -3,  -1,  84,  38
  2192.  dc   -1,  98,  53,  -5,  -1, 129,  -1,   8, 128,  -3,  -1,  22,  97,  -1,   6
  2193.  dc   96, -13,  -9,  -5,  -3,  -1,  83,  68,  37,  -1,  82,   5,  -1,  21,  81
  2194.  dc   -7,  -3,  -1,  52,  67,  -1,  80,  36,  -3,  -1,  66,  51,  20, -19, -11
  2195.  dc   -5,  -1,  65,  -1,   4,  64,  -3,  -1,  35,  50,  19,  -3,  -1,  49,   3
  2196.  dc   -1,  48,  34,  -3,  -1,  18,  33,  -1,   2,  32,  -3,  -1,  17,   1,  16
  2197.  dc    0
  2198. htab15
  2199.  dc -495,-445,-355,-263,-183,-115, -77, -43, -27, -13,  -7,  -3,  -1, 255, 239
  2200.  dc   -1, 254, 223,  -1, 238,  -1, 253, 207,  -7,  -3,  -1, 252, 222,  -1, 237
  2201.  dc  191,  -1, 251,  -1, 206, 236,  -7,  -3,  -1, 221, 175,  -1, 250, 190,  -3
  2202.  dc   -1, 235, 205,  -1, 220, 159, -15,  -7,  -3,  -1, 249, 234,  -1, 189, 219
  2203.  dc   -3,  -1, 143, 248,  -1, 204, 158,  -7,  -3,  -1, 233, 127,  -1, 247, 173
  2204.  dc   -3,  -1, 218, 188,  -1, 111,  -1, 174,  15, -19, -11,  -3,  -1, 203, 246
  2205.  dc   -3,  -1, 142, 232,  -1,  95, 157,  -3,  -1, 245, 126,  -1, 231, 172,  -9
  2206.  dc   -3,  -1, 202, 187,  -3,  -1, 217, 141,  79,  -3,  -1, 244,  63,  -1, 243
  2207.  dc  216, -33, -17,  -9,  -3,  -1, 230,  47,  -1, 242,  -1, 110, 240,  -3,  -1
  2208.  dc   31, 241,  -1, 156, 201,  -7,  -3,  -1,  94, 171,  -1, 186, 229,  -3,  -1
  2209.  dc  125, 215,  -1,  78, 228, -15,  -7,  -3,  -1, 140, 200,  -1,  62, 109,  -3
  2210.  dc   -1, 214, 227,  -1, 155, 185,  -7,  -3,  -1,  46, 170,  -1, 226,  30,  -5
  2211.  dc   -1, 225,  -1,  14, 224,  -1,  93, 213, -45, -25, -13,  -7,  -3,  -1, 124
  2212.  dc  199,  -1,  77, 139,  -1, 212,  -1, 184, 154,  -7,  -3,  -1, 169, 108,  -1
  2213.  dc  198,  61,  -1, 211, 210,  -9,  -5,  -3,  -1,  45,  13,  29,  -1, 123, 183
  2214.  dc   -5,  -1, 209,  -1,  92, 208,  -1, 197, 138, -17,  -7,  -3,  -1, 168,  76
  2215.  dc   -1, 196, 107,  -5,  -1, 182,  -1, 153,  12,  -1,  60, 195,  -9,  -3,  -1
  2216.  dc  122, 167,  -1, 166,  -1, 192,  11,  -1, 194,  -1,  44,  91, -55, -29, -15
  2217.  dc   -7,  -3,  -1, 181,  28,  -1, 137, 152,  -3,  -1, 193,  75,  -1, 180, 106
  2218.  dc   -5,  -3,  -1,  59, 121, 179,  -3,  -1, 151, 136,  -1,  43,  90, -11,  -5
  2219.  dc   -1, 178,  -1, 165,  27,  -1, 177,  -1, 176, 105,  -7,  -3,  -1, 150,  74
  2220.  dc   -1, 164, 120,  -3,  -1, 135,  58, 163, -17,  -7,  -3,  -1,  89, 149,  -1
  2221.  dc   42, 162,  -3,  -1,  26, 161,  -3,  -1,  10, 160, 104,  -7,  -3,  -1, 134
  2222.  dc   73,  -1, 148,  57,  -5,  -1, 147,  -1, 119,   9,  -1,  88, 133, -53, -29
  2223.  dc  -13,  -7,  -3,  -1,  41, 103,  -1, 118, 146,  -1, 145,  -1,  25, 144,  -7
  2224.  dc   -3,  -1,  72, 132,  -1,  87, 117,  -3,  -1,  56, 131,  -1, 102,  71,  -7
  2225.  dc   -3,  -1,  40, 130,  -1,  24, 129,  -7,  -3,  -1, 116,   8,  -1, 128,  86
  2226.  dc   -3,  -1, 101,  55,  -1, 115,  70, -17,  -7,  -3,  -1,  39, 114,  -1, 100
  2227.  dc   23,  -3,  -1,  85, 113,  -3,  -1,   7, 112,  54,  -7,  -3,  -1,  99,  69
  2228.  dc   -1,  84,  38,  -3,  -1,  98,  22,  -3,  -1,   6,  96,  53, -33, -19,  -9
  2229.  dc   -5,  -1,  97,  -1,  83,  68,  -1,  37,  82,  -3,  -1,  21,  81,  -3,  -1
  2230.  dc    5,  80,  52,  -7,  -3,  -1,  67,  36,  -1,  66,  51,  -1,  65,  -1,  20
  2231.  dc    4,  -9,  -3,  -1,  35,  50,  -3,  -1,  64,   3,  19,  -3,  -1,  49,  48
  2232.  dc   34,  -9,  -7,  -3,  -1,  18,  33,  -1,   2,  32,  17,  -3,  -1,   1,  16
  2233.  dc    0
  2234. htab16
  2235.  dc -509,-503,-461,-323,-103, -37, -27, -15,  -7,  -3,  -1, 239, 254,  -1, 223
  2236.  dc  253,  -3,  -1, 207, 252,  -1, 191, 251,  -5,  -1, 175,  -1, 250, 159,  -3
  2237.  dc   -1, 249, 248, 143,  -7,  -3,  -1, 127, 247,  -1, 111, 246, 255,  -9,  -5
  2238.  dc   -3,  -1,  95, 245,  79,  -1, 244, 243, -53,  -1, 240,  -1,  63, -29, -19
  2239.  dc  -13,  -7,  -5,  -1, 206,  -1, 236, 221, 222,  -1, 233,  -1, 234, 217,  -1
  2240.  dc  238,  -1, 237, 235,  -3,  -1, 190, 205,  -3,  -1, 220, 219, 174, -11,  -5
  2241.  dc   -1, 204,  -1, 173, 218,  -3,  -1, 126, 172, 202,  -5,  -3,  -1, 201, 125
  2242.  dc   94, 189, 242, -93,  -5,  -3,  -1,  47,  15,  31,  -1, 241, -49, -25, -13
  2243.  dc   -5,  -1, 158,  -1, 188, 203,  -3,  -1, 142, 232,  -1, 157, 231,  -7,  -3
  2244.  dc   -1, 187, 141,  -1, 216, 110,  -1, 230, 156, -13,  -7,  -3,  -1, 171, 186
  2245.  dc   -1, 229, 215,  -1,  78,  -1, 228, 140,  -3,  -1, 200,  62,  -1, 109,  -1
  2246.  dc  214, 155, -19, -11,  -5,  -3,  -1, 185, 170, 225,  -1, 212,  -1, 184, 169
  2247.  dc   -5,  -1, 123,  -1, 183, 208, 227,  -7,  -3,  -1,  14, 224,  -1,  93, 213
  2248.  dc   -3,  -1, 124, 199,  -1,  77, 139, -75, -45, -27, -13,  -7,  -3,  -1, 154
  2249.  dc  108,  -1, 198,  61,  -3,  -1,  92, 197,  13,  -7,  -3,  -1, 138, 168,  -1
  2250.  dc  153,  76,  -3,  -1, 182, 122,  60, -11,  -5,  -3,  -1,  91, 137,  28,  -1
  2251.  dc  192,  -1, 152, 121,  -1, 226,  -1,  46,  30, -15,  -7,  -3,  -1, 211,  45
  2252.  dc   -1, 210, 209,  -5,  -1,  59,  -1, 151, 136,  29,  -7,  -3,  -1, 196, 107
  2253.  dc   -1, 195, 167,  -1,  44,  -1, 194, 181, -23, -13,  -7,  -3,  -1, 193,  12
  2254.  dc   -1,  75, 180,  -3,  -1, 106, 166, 179,  -5,  -3,  -1,  90, 165,  43,  -1
  2255.  dc  178,  27, -13,  -5,  -1, 177,  -1,  11, 176,  -3,  -1, 105, 150,  -1,  74
  2256.  dc  164,  -5,  -3,  -1, 120, 135, 163,  -3,  -1,  58,  89,  42, -97, -57, -33
  2257.  dc  -19, -11,  -5,  -3,  -1, 149, 104, 161,  -3,  -1, 134, 119, 148,  -5,  -3
  2258.  dc   -1,  73,  87, 103, 162,  -5,  -1,  26,  -1,  10, 160,  -3,  -1,  57, 147
  2259.  dc   -1,  88, 133,  -9,  -3,  -1,  41, 146,  -3,  -1, 118,   9,  25,  -5,  -1
  2260.  dc  145,  -1, 144,  72,  -3,  -1, 132, 117,  -1,  56, 131, -21, -11,  -5,  -3
  2261.  dc   -1, 102,  40, 130,  -3,  -1,  71, 116,  24,  -3,  -1, 129, 128,  -3,  -1
  2262.  dc    8,  86,  55,  -9,  -5,  -1, 115,  -1, 101,  70,  -1,  39, 114,  -5,  -3
  2263.  dc   -1, 100,  85,   7,  23, -23, -13,  -5,  -1, 113,  -1, 112,  54,  -3,  -1
  2264.  dc   99,  69,  -1,  84,  38,  -3,  -1,  98,  22,  -1,  97,  -1,   6,  96,  -9
  2265.  dc   -5,  -1,  83,  -1,  53,  68,  -1,  37,  82,  -1,  81,  -1,  21,   5, -33
  2266.  dc  -23, -13,  -7,  -3,  -1,  52,  67,  -1,  80,  36,  -3,  -1,  66,  51,  20
  2267.  dc   -5,  -1,  65,  -1,   4,  64,  -1,  35,  50,  -3,  -1,  19,  49,  -3,  -1
  2268.  dc    3,  48,  34,  -3,  -1,  18,  33,  -1,   2,  32,  -3,  -1,  17,   1,  16
  2269.  dc    0
  2270. htab24
  2271.  dc -451,-117, -43, -25, -15,  -7,  -3,  -1, 239, 254,  -1, 223, 253,  -3,  -1
  2272.  dc  207, 252,  -1, 191, 251,  -5,  -1, 250,  -1, 175, 159,  -1, 249, 248,  -9
  2273.  dc   -5,  -3,  -1, 143, 127, 247,  -1, 111, 246,  -3,  -1,  95, 245,  -1,  79
  2274.  dc  244, -71,  -7,  -3,  -1,  63, 243,  -1,  47, 242,  -5,  -1, 241,  -1,  31
  2275.  dc  240, -25,  -9,  -1,  15,  -3,  -1, 238, 222,  -1, 237, 206,  -7,  -3,  -1
  2276.  dc  236, 221,  -1, 190, 235,  -3,  -1, 205, 220,  -1, 174, 234, -15,  -7,  -3
  2277.  dc   -1, 189, 219,  -1, 204, 158,  -3,  -1, 233, 173,  -1, 218, 188,  -7,  -3
  2278.  dc   -1, 203, 142,  -1, 232, 157,  -3,  -1, 217, 126,  -1, 231, 172, 255,-235
  2279.  dc -143, -77, -45, -25, -15,  -7,  -3,  -1, 202, 187,  -1, 141, 216,  -5,  -3
  2280.  dc   -1,  14, 224,  13, 230,  -5,  -3,  -1, 110, 156, 201,  -1,  94, 186,  -9
  2281.  dc   -5,  -1, 229,  -1, 171, 125,  -1, 215, 228,  -3,  -1, 140, 200,  -3,  -1
  2282.  dc   78,  46,  62, -15,  -7,  -3,  -1, 109, 214,  -1, 227, 155,  -3,  -1, 185
  2283.  dc  170,  -1, 226,  30,  -7,  -3,  -1, 225,  93,  -1, 213, 124,  -3,  -1, 199
  2284.  dc   77,  -1, 139, 184, -31, -15,  -7,  -3,  -1, 212, 154,  -1, 169, 108,  -3
  2285.  dc   -1, 198,  61,  -1, 211,  45,  -7,  -3,  -1, 210,  29,  -1, 123, 183,  -3
  2286.  dc   -1, 209,  92,  -1, 197, 138, -17,  -7,  -3,  -1, 168, 153,  -1,  76, 196
  2287.  dc   -3,  -1, 107, 182,  -3,  -1, 208,  12,  60,  -7,  -3,  -1, 195, 122,  -1
  2288.  dc  167,  44,  -3,  -1, 194,  91,  -1, 181,  28, -57, -35, -19,  -7,  -3,  -1
  2289.  dc  137, 152,  -1, 193,  75,  -5,  -3,  -1, 192,  11,  59,  -3,  -1, 176,  10
  2290.  dc   26,  -5,  -1, 180,  -1, 106, 166,  -3,  -1, 121, 151,  -3,  -1, 160,   9
  2291.  dc  144,  -9,  -3,  -1, 179, 136,  -3,  -1,  43,  90, 178,  -7,  -3,  -1, 165
  2292.  dc   27,  -1, 177, 105,  -1, 150, 164, -17,  -9,  -5,  -3,  -1,  74, 120, 135
  2293.  dc   -1,  58, 163,  -3,  -1,  89, 149,  -1,  42, 162,  -7,  -3,  -1, 161, 104
  2294.  dc   -1, 134, 119,  -3,  -1,  73, 148,  -1,  57, 147, -63, -31, -15,  -7,  -3
  2295.  dc   -1,  88, 133,  -1,  41, 103,  -3,  -1, 118, 146,  -1,  25, 145,  -7,  -3
  2296.  dc   -1,  72, 132,  -1,  87, 117,  -3,  -1,  56, 131,  -1, 102,  40, -17,  -7
  2297.  dc   -3,  -1, 130,  24,  -1,  71, 116,  -5,  -1, 129,  -1,   8, 128,  -1,  86
  2298.  dc  101,  -7,  -5,  -1,  23,  -1,   7, 112, 115,  -3,  -1,  55,  39, 114, -15
  2299.  dc   -7,  -3,  -1,  70, 100,  -1,  85, 113,  -3,  -1,  54,  99,  -1,  69,  84
  2300.  dc   -7,  -3,  -1,  38,  98,  -1,  22,  97,  -5,  -3,  -1,   6,  96,  53,  -1
  2301.  dc   83,  68, -51, -37, -23, -15,  -9,  -3,  -1,  37,  82,  -1,  21,  -1,   5
  2302.  dc   80,  -1,  81,  -1,  52,  67,  -3,  -1,  36,  66,  -1,  51,  20,  -9,  -5
  2303.  dc   -1,  65,  -1,   4,  64,  -1,  35,  50,  -1,  19,  49,  -7,  -5,  -3,  -1
  2304.  dc    3,  48,  34,  18,  -1,  33,  -1,   2,  32,  -3,  -1,  17,   1,  -1,  16
  2305.  dc    0
  2306. htaba
  2307.  dc  -29, -21, -13,  -7,  -3,  -1,  11,  15,  -1,  13,  14,  -3,  -1,   7,   5
  2308.  dc    9,  -3,  -1,   6,   3,  -1,  10,  12,  -3,  -1,   2,   1,  -1,   4,   8
  2309.  dc    0
  2310. htabb
  2311.  dc  -15,  -7,  -3,  -1,  15,  14,  -1,  13,  12,  -3,  -1,  11,  10,  -1,   9
  2312.  dc    8,  -7,  -3,  -1,   7,   6,  -1,   5,   4,  -3,  -1,   3,   2,  -1,   1
  2313.  dc    0
  2314. htablinbits
  2315.  dc 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13,0,0
  2316. htabs
  2317.  dc htab00,htab01,htab02,htab03,htab04,htab05,htab06,htab07,htab08,htab09
  2318.  dc htab10,htab11,htab12,htab13,htab14,htab15,htab16,htab16,htab16,htab16
  2319.  dc htab16,htab16,htab16,htab16,htab24,htab24,htab24,htab24,htab24,htab24
  2320.  dc htab24,htab24,htaba,htabb
  2321.  
  2322.  
  2323. sfbands_p
  2324.     ds    1
  2325. sfbands_tab
  2326.     dc    sfbands_44100,sfbands_48000,sfbands_32000
  2327. sfbands_44100
  2328.  dc 0,12,24,36,48,66,90,120,156,198,252,318,408,576
  2329. sfbands_48000
  2330.  dc 0,12,24,36,48,66,84,114,150,192,240,300,378,576
  2331. sfbands_32000
  2332.  dc 0,12,24,36,48,66,90,126,174,234,312,414,540,576
  2333. sfbandl_p
  2334.     ds    1
  2335. sfbandl_tab
  2336.     dc    sfbandl_44100,sfbandl_48000,sfbandl_32000
  2337. sfbandl_44100
  2338.  dc 0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576
  2339. sfbandl_48000
  2340.  dc 0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576
  2341. sfbandl_32000
  2342.  dc 0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576
  2343.  
  2344. pretab
  2345.  dc 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0
  2346.  
  2347.  
  2348. sfbtab0        dc    0,6,11,16,21
  2349. sfbtab1        dc    0,9,18,24,36
  2350. sfbtab2        dc    0,8,17,23,35
  2351.  
  2352. cs_ca_tab_p    dc    cs_ca_tab
  2353.  
  2354. imdct_windows
  2355. ;win_type=0  NORMAL_WINDOW
  2356.  dc $059552,$10b515,$1bb44b,$267d87,$30fbc5,$3b1a94,$44c63c,$4debe5,$5679bd
  2357.  dc $5e5f1b,$658c9a,$6bf440,$718992,$7641af,$7a1366,$7cf744,$7ee7aa,$7fe0d0
  2358.  dc $7fe0d0,$7ee7aa,$7cf744,$7a1366,$7641af,$718992,$6bf440,$658c9a,$5e5f1b
  2359.  dc $5679bd,$4debe5,$44c63c,$3b1a94,$30fbc5,$267d87,$1bb44b,$10b515,$059552
  2360. ;win_type=1  START_WINDOW
  2361.  dc $059552,$10b515,$1bb44b,$267d87,$30fbc5,$3b1a94,$44c63c,$4debe5,$5679bd
  2362.  dc $5e5f1b,$658c9a,$6bf440,$718992,$7641af,$7a1366,$7cf744,$7ee7aa,$7fe0d0
  2363.  dc $7fffff,$7fffff,$7fffff,$7fffff,$7fffff,$7fffff,$7ee7aa,$7641af,$658c9a
  2364.  dc $4debe5,$30fbc5,$10b515,$000000,$000000,$000000,$000000,$000000,$000000
  2365. ;win_type=2 -> useless, because this case is done by short block imdct code.
  2366. ; ds 36
  2367.  
  2368. slentab0    dc    0,0,0,0,3,1,1,1,2,2,2,3,3,3,4,4
  2369. slentab1    dc    0,1,2,3,0,1,2,3,1,2,3,1,2,3,2,3
  2370. newslen        ds    4
  2371.  
  2372. ;win_type=3  STOP_WINDOW
  2373.  dc $000000,$000000,$000000,$000000,$000000,$000000,$10b515,$30fbc5,$4debe5
  2374.  dc $658c9a,$7641af,$7ee7aa,$7fffff,$7fffff,$7fffff,$7fffff,$7fffff,$7fffff
  2375.  dc $7fe0d0,$7ee7aa,$7cf744,$7a1366,$7641af,$718992,$6bf440,$658c9a,$5e5f1b
  2376.  dc $5679bd,$4debe5,$44c63c,$3b1a94,$30fbc5,$267d87,$1bb44b,$10b515,$059552
  2377.  
  2378.  
  2379. imdct_l_tab
  2380. ;coefficients for long blocks imdct
  2381. ;they are stored in order of use, so do not change their order !
  2382. ;lots of them are divided by two in order to use fixed point representation
  2383.  
  2384. ;9 points idct on even indices and twiddle factors,
  2385. ;or butterflies for 36 points idct
  2386. ; all factors are/2
  2387.  dc    1.8793852415718/2
  2388.  dc    1.532088886238/2
  2389.  dc    0.5
  2390.  dc    0.34729635533386/2
  2391.  dc    1.9696155060244/2    ;tmp0_
  2392.  dc    1.732050808/2
  2393.  dc    1.2855752193731/2
  2394.  dc    0.68404028665134/2
  2395.  dc    1.732050808/2        ;tmp1_
  2396.  dc    -0.34729635533386/2
  2397.  dc    -1.8793852415718/2
  2398.  dc    1.532088886238/2
  2399.  dc    1.2855752193731/2    ;tmp2_
  2400.  dc    -1.732050808/2
  2401.  dc    -0.68404028665134/2
  2402.  dc    1.9696155060244/2
  2403.  dc    -1.532088886238/2
  2404.  dc    0.34729635533386/2
  2405.  dc    -1.8793852415718/2
  2406.  dc    0.68404028665134/2    ;tmp3_
  2407.  dc    -1.732050808/2
  2408.  dc    1.9696155060244/2
  2409.  dc    -1.2855752193731/2
  2410. ;9 points idct on odd indices and twiddle factors,
  2411. ;or butterflies for 36 points idct
  2412. ; all factors are/2 except some o factors /8 or not divided.
  2413.  dc    1.8793852415718/2
  2414.  dc    1.532088886238/2
  2415.  dc    0.34729635533386/2
  2416.  dc    1.9696155060244/2    ;tmp0_o
  2417.  dc    1.732050808/2
  2418.  dc    1.2855752193731/2
  2419.  dc    0.68404028665134/2
  2420.  dc    0.501909918         ;o0 factor
  2421.  dc    5.736856623/8        ;o7 factor
  2422.  dc    1.732050808/2        ;tmp1_o
  2423.  dc    0.517638090        ;o1 factor
  2424.  dc    1.931851653/2        ;o6 factor
  2425.  dc    -0.34729635533386/2
  2426.  dc    -1.8793852415718/2
  2427.  dc    1.532088886238/2
  2428.  dc    1.2855752193731/2    ;tmp2_o
  2429.  dc    -1.732050808/2
  2430.  dc    -0.68404028665134/2
  2431.  dc    1.9696155060244/2
  2432.  dc    0.551688959        ;o2 factor
  2433.  dc    1.183100792/2        ;o5 factor
  2434.  dc    -1.532088886238/2
  2435.  dc    0.34729635533386/2
  2436.  dc    -1.8793852415718/2
  2437.  dc    0.68404028665134/2    ;tmp3_o
  2438.  dc    -1.732050808/2
  2439.  dc    1.9696155060244/2
  2440.  dc    -1.2855752193731/2
  2441.  dc    0.610387294        ;o3 factor
  2442.  dc    0.871723397        ;o4 factor
  2443.  dc    0.707106781/2        ;tmp4o + twiddle factor
  2444. ;factors for final tmp computation
  2445. imdct_l_tab2_p    dc    imdct_l_tab2
  2446. imdct_l_tab2
  2447.  dc    -0.250238171
  2448.  dc    -0.25215724
  2449.  dc    -0.2560698785
  2450.  dc    -0.262132281
  2451.  dc    -0.541196100 
  2452.  dc    -0.2818454865
  2453.  dc    -0.2964222615
  2454.  dc    -0.3151181035
  2455.  dc    -0.339085426
  2456.  dc    -0.370046808
  2457.  dc    -0.4106699075
  2458.  dc    -0.465289749
  2459.  dc    -0.5414201425
  2460.  dc    -1.306562965/2
  2461.  dc    -0.831377381
  2462.  dc    -1.155056579/2
  2463.  dc    -1.915324394/2
  2464.  dc    -5.731396405/8
  2465.  
  2466.  
  2467. imdct_s_tab
  2468. ;coefficients for short blocks imdct
  2469. ;they are stored in order of use, so do not change their order !
  2470. ;some of them are divided by two in order to use fixed point representation
  2471.  
  2472. ;3 points idct/6 points idct+twiddle factors for odd indices
  2473.  dc    0.866025403,0.5    ;for tmp0 and tmp5
  2474.  dc    0.517638090        ;twiddle factor for tmp5
  2475.  dc    0.707106781        ;twiddle factor for tmp4
  2476.  dc    0.5
  2477.  dc    1.931851653/2        ;twiddle factor/2 for tmp3
  2478. ;12 points twiddle/shifting to imdct/windowing factors
  2479. imdct_s_tab2_p    dc    imdct_s_tab2
  2480. imdct_s_tab2
  2481.  dc    0.1072063584        ;first imdct point=out[6]
  2482.  dc    0.4999999996
  2483.  dc    2.33195123/4        ;/4
  2484.  dc    -3.03905801/4        ;/4
  2485.  dc    -1.207106781/2        ;/2
  2486.  dc    -0.8143131387
  2487.  dc    -0.6248444486
  2488.  dc    -0.4999999996
  2489.  dc    -0.4000995771
  2490.  dc    -0.3070072035
  2491.  dc    -0.2071067809
  2492.  dc    -0.08226233216
  2493.  
  2494.  
  2495.  
  2496.     ;** quantab - y=2^((x-210)/4)
  2497.     ;** for DSP double precision mode: factor 2^(23+12)
  2498.     ;max = (double)0x1000000;
  2499.     ;val = pow( 2.0, ((double)i-210.0) * 0.25 ) * (double)(1<<12);
  2500.     ;quantab[i*2]   = (LONG)( val * 0.5 );
  2501.     ;quantab[i*2+1] = (LONG)( fmod( ldexp(val,23) , max ) + 0.5 );
  2502. x_quantab
  2503.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2504.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2505.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2506.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2507.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2508.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2509.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2510.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2511.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2512.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2513.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2514.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2515.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2516.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2517.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2518.  dc    $000000,$000000, $000000,$000000, $000000,$000000, $000000,$000000
  2519.  dc    $000000,$000000, $000000,$000000, $000000,$000001, $000000,$000001
  2520.  dc    $000000,$000001, $000000,$000001, $000000,$000001, $000000,$000001
  2521.  dc    $000000,$000001, $000000,$000002, $000000,$000002, $000000,$000002
  2522.  dc    $000000,$000003, $000000,$000003, $000000,$000004, $000000,$000005
  2523.  dc    $000000,$000006, $000000,$000007, $000000,$000008, $000000,$00000a
  2524.  dc    $000000,$00000b, $000000,$00000d, $000000,$000010, $000000,$000013
  2525.  dc    $000000,$000017, $000000,$00001b, $000000,$000020, $000000,$000026
  2526.  dc    $000000,$00002d, $000000,$000036, $000000,$000040, $000000,$00004c
  2527.  dc    $000000,$00005b, $000000,$00006c, $000000,$000080, $000000,$000098
  2528.  dc    $000000,$0000b5, $000000,$0000d7, $000000,$000100, $000000,$000130
  2529.  dc    $000000,$00016a, $000000,$0001af, $000000,$000200, $000000,$000261
  2530.  dc    $000000,$0002d4, $000000,$00035d, $000000,$000400, $000000,$0004c2
  2531.  dc    $000000,$0005a8, $000000,$0006ba, $000000,$000800, $000000,$000983
  2532.  dc    $000000,$000b50, $000000,$000d74, $000000,$001000, $000000,$001307
  2533.  dc    $000000,$0016a1, $000000,$001ae9, $000000,$002000, $000000,$00260e
  2534.  dc    $000000,$002d41, $000000,$0035d1, $000000,$004000, $000000,$004c1c
  2535.  dc    $000000,$005a82, $000000,$006ba2, $000000,$008000, $000000,$009838
  2536.  dc    $000000,$00b505, $000000,$00d745, $000000,$010000, $000000,$013070
  2537.  dc    $000000,$016a0a, $000000,$01ae8a, $000000,$020000, $000000,$0260e0
  2538.  dc    $000000,$02d414, $000000,$035d14, $000000,$040000, $000000,$04c1c0
  2539.  dc    $000000,$05a828, $000000,$06ba28, $000000,$080000, $000000,$09837f
  2540.  dc    $000000,$0b504f, $000000,$0d7450, $000000,$100000, $000000,$1306fe
  2541.  dc    $000000,$16a09e, $000000,$1ae8a0, $000000,$200000, $000000,$260dfc
  2542.  dc    $000000,$2d413d, $000000,$35d13f, $000000,$400000, $000000,$4c1bf8
  2543.  dc    $000000,$5a827a, $000000,$6ba27e, $000000,$800000, $000000,$9837f0
  2544.  dc    $000000,$b504f3, $000000,$d744fd, $000001,$000000, $000001,$306fe1
  2545.  dc    $000001,$6a09e6, $000001,$ae89fa, $000002,$000000, $000002,$60dfc1
  2546.  dc    $000002,$d413cd, $000003,$5d13f3, $000004,$000000, $000004,$c1bf83
  2547.  dc    $000005,$a8279a, $000006,$ba27e6, $000008,$000000, $000009,$837f05
  2548.  dc    $00000b,$504f33, $00000d,$744fcd, $000010,$000000, $000013,$06fe0a
  2549.  dc    $000016,$a09e66, $00001a,$e89f99, $000020,$000000, $000026,$0dfc14
  2550.  dc    $00002d,$413ccd, $000035,$d13f33, $000040,$000000, $00004c,$1bf829
  2551.  dc    $00005a,$82799a, $00006b,$a27e65, $000080,$000000, $000098,$37f052
  2552.  dc    $0000b5,$04f334, $0000d7,$44fccb, $000100,$000000, $000130,$6fe0a3
  2553.  dc    $00016a,$09e668, $0001ae,$89f996, $000200,$000000, $000260,$dfc146
  2554.  dc    $0002d4,$13ccd0, $00035d,$13f32b, $000400,$000000, $0004c1,$bf828c
  2555.  dc    $0005a8,$2799a0, $0006ba,$27e657, $000800,$000000, $000983,$7f0519
  2556.  dc    $000b50,$4f3340, $000d74,$4fccad, $001000,$000000, $001306,$fe0a32
  2557.  dc    $0016a0,$9e667f, $001ae8,$9f995b, $002000,$000000, $00260d,$fc1463
  2558.  dc    $002d41,$3cccfe, $0035d1,$3f32b6, $004000,$000000, $004c1b,$f828c7
  2559.  dc    $005a82,$7999fd, $006ba2,$7e656b, $008000,$000000, $009837,$f0518e
  2560.  dc    $00b504,$f333fa, $00d744,$fccad7, $010000,$000000, $01306f,$e0a31b
  2561.  dc    $016a09,$e667f4, $01ae89,$f995ad, $020000,$000000, $0260df,$c14637
  2562.  dc    $02d413,$cccfe7, $035d13,$f32b5a, $040000,$000000, $04c1bf,$828c6e
  2563.  dc    $05a827,$999fcf, $06ba27,$e656b5, $080000,$000000, $09837f,$0518dc
  2564.  dc    $0b504f,$333f9e, $0d744f,$ccad6a, $100000,$000000, $1306fe,$0a31b7
  2565.  dc    $16a09e,$667f3c, $1ae89f,$995ad4, $200000,$000000, $260dfc,$14636e
  2566.  dc    $2d413c,$ccfe78, $35d13f,$32b5a7, $400000,$000000, $4c1bf8,$28c6dc
  2567.  
  2568.  
  2569.  
  2570.  
  2571.  
  2572.  
  2573.     org    y:
  2574.  
  2575.     align    16
  2576. cs_ca_tab
  2577.  dc  0.857492925712, -0.5144957554270
  2578.  dc  0.881741997318, -0.4717319685650
  2579.  dc  0.949628649103, -0.3133774542040
  2580.  dc  0.983314592492, -0.1819131996110
  2581.  dc  0.995517816065, -0.0945741925262
  2582.  dc  0.999160558175, -0.0409655828852
  2583.  dc  0.999899195243, -0.0141985685725
  2584.  dc  0.999993155067, -0.0036999746738
  2585.  
  2586. ;->ydata+16
  2587. busy    dc    0
  2588.  
  2589. ;->ydata+17
  2590. forcemono
  2591.     dc    0
  2592.  
  2593. ;->ydata+18
  2594. pow43tab
  2595.     ds    8206        ;comes from main prog (see 'MP3_pow43tab.h')
  2596.  
  2597. ;    dc    "**prev0**"
  2598. hybrid_prev0        ds    576
  2599. ;    dc    "**prev1**"
  2600. hybrid_prev1        ds    576
  2601. ;    dc    "**prev.**"
  2602.  
  2603. ;    dc    "**reorder***"
  2604. y_reorder        ds    576-378    ;largest scalefactor-band for short blocks
  2605. ;    dc    ">>reorder<<<"
  2606.  
  2607. synth_tab_window
  2608.  dc $000000,$fff8c1,$003540,$ff8d41,$01fd40,$faf7c1,$066b80,$db63c1
  2609.  dc $494780,$249c40,$066b80,$050840,$01fd40,$0072c0,$003540,$000740
  2610.  dc $ffffc1,$fff841,$003680,$ff7e41,$01f400,$fa9cc1,$05d1c0,$d99601
  2611.  dc $493c00,$22ce00,$06f780,$04ad00,$0203c0,$006440,$003400,$000680
  2612.  dc $ffffc1,$fff741,$003780,$ff6ec1,$01e800,$fa4241,$052a00,$d7ca01
  2613.  dc $491a00,$20ffc0,$077600,$045240,$020800,$0056c0,$003280,$000600
  2614.  dc $ffffc1,$fff681,$003840,$ff5ec1,$01d940,$f9e8c1,$047440,$d60081
  2615.  dc $48e180,$1f32c0,$07e700,$03f7c0,$0209c0,$004980,$003100,$000540
  2616.  dc $ffffc1,$fff5c1,$0038c0,$ff4e41,$01c780,$f990c1,$03b000,$d43ac1
  2617.  dc $489240,$1d6800,$084b00,$039e40,$020940,$003d00,$002f80,$0004c0
  2618.  dc $ffffc1,$fff4c1,$003900,$ff3d41,$01b2c0,$f93a41,$02ddc0,$d279c1
  2619.  dc $482d00,$1ba040,$08a200,$0345c0,$0206c0,$003140,$002dc0,$000440
  2620.  dc $ffffc1,$fff3c1,$003900,$ff2c01,$019b00,$f8e641,$01fd40,$d0be81
  2621.  dc $47b1c0,$19dc80,$08ecc0,$02ef00,$020240,$002640,$002c00,$000400
  2622.  dc $ffff81,$fff2c1,$0038c0,$ff1a41,$017fc0,$f894c1,$010e80,$cf09c1
  2623.  dc $4720c0,$181d80,$092b40,$0299c0,$01fc00,$001bc0,$002a40,$000380
  2624.  dc $ffff81,$fff181,$003800,$ff0841,$016180,$f84681,$001180,$cd5cc1
  2625.  dc $467a40,$166440,$095e00,$024680,$01f440,$001200,$002840,$000340
  2626.  dc $ffff81,$fff041,$003740,$fef601,$014000,$f7fbc1,$ff0681,$cbb881
  2627.  dc $45bf00,$14b140,$098580,$01f580,$01ea80,$000900,$002680,$0002c0
  2628.  dc $ffff81,$ffef01,$0035c0,$fee3c1,$011ac0,$f7b541,$fded81,$ca1d81
  2629.  dc $44ef80,$130580,$09a1c0,$01a700,$01dfc0,$000080,$0024c0,$000280
  2630.  dc $ffff41,$ffedc1,$003400,$fed181,$00f280,$f77341,$fcc701,$c88d81
  2631.  dc $440bc0,$1161c0,$09b3c0,$015b00,$01d380,$fff8c1,$0022c0,$000240
  2632.  dc $ffff41,$ffec41,$003200,$febf41,$00c680,$f73681,$fb92c1,$c708c1
  2633.  dc $431500,$0fc6c0,$09bb80,$0111c0,$01c640,$fff1c1,$002100,$000200
  2634.  dc $ffff01,$ffeac1,$002f40,$fead01,$009740,$f6ff41,$fa5181,$c59081
  2635.  dc $420b40,$0e3500,$09b9c0,$00cb80,$01b7c0,$ffeb41,$001f40,$0001c0
  2636.  dc $ffff01,$ffe941,$002c40,$fe9b01,$006480,$f6ce01,$f90381,$c425c1
  2637.  dc $40ef80,$0cad00,$09af00,$008840,$01a880,$ffe581,$001d40,$0001c0
  2638.  dc $fffec1,$ffe7c1,$0028c0,$fe8981,$002e40,$f6a3c1,$f7a901,$c2c901
  2639.  dc $3fc280,$0b2fc0,$099b80,$004800,$019880,$ffe041,$001bc0,$000180
  2640.  dc $fffec1,$ffe601,$002480,$fe7841,$fff4c1,$f68041,$f64241,$c17b41
  2641.  dc $3e84c0,$09bdc0,$097fc0,$000b40,$0187c0,$ffdb81,$001a00,$000140
  2642.  dc $fffe81,$ffe441,$001fc0,$fe6781,$ffb801,$f66481,$f4d041,$c03d81
  2643.  dc $3d3700,$085700,$095c40,$ffd1c1,$017680,$ffd741,$001840,$000140
  2644.  dc $fffe41,$ffe2c1,$001a80,$fe5781,$ff77c1,$f65101,$f35301,$bf1081
  2645.  dc $3bda40,$06fc80,$093200,$ff9b81,$016500,$ffd3c1,$0016c0,$000100
  2646.  dc $fffe41,$ffe0c1,$0014c0,$fe4841,$ff3481,$f64641,$f1cb01,$bdf4c1
  2647.  dc $3a6f80,$05ae80,$0900c0,$ff68c1,$015300,$ffd0c1,$001540,$000100
  2648.  dc $fffe01,$ffdf01,$000e40,$fe39c1,$feee41,$f64481,$f03941,$bceb01
  2649.  dc $38f740,$046d40,$08c980,$ff3981,$0140c0,$ffce01,$0013c0,$0000c0
  2650.  dc $fffdc1,$ffdd41,$000740,$fe2c81,$fea501,$f64c41,$ee9e41,$bbf441
  2651.  dc $377280,$033900,$088cc0,$ff0d81,$012e80,$ffcc01,$001240,$0000c0
  2652.  dc $fffd81,$ffdb41,$ffff81,$fe2041,$fe5901,$f65e41,$ecfa81,$bb1081
  2653.  dc $35e280,$021280,$084ac0,$fee541,$011c40,$ffca41,$001100,$000080
  2654.  dc $fffd41,$ffd981,$fff701,$fe1581,$fe0a81,$f67a81,$eb4ec1,$ba4101
  2655.  dc $344780,$00f980,$080440,$fec001,$010a00,$ffc8c1,$000fc0,$000080
  2656.  dc $fffcc1,$ffd7c1,$ffee01,$fe0bc1,$fdb981,$f6a201,$e99bc1,$b985c1
  2657.  dc $32a340,$ffee81,$07b980,$fe9e81,$00f7c0,$ffc801,$000e80,$000080
  2658.  dc $fffc81,$ffd5c1,$ffe441,$fe0401,$fd6641,$f6d4c1,$e7e281,$b8df41
  2659.  dc $30f640,$fef181,$076b40,$fe8041,$00e5c0,$ffc741,$000d40,$000080
  2660.  dc $fffc01,$ffd401,$ffd9c1,$fdfdc1,$fd1101,$f71341,$e62381,$b84e41
  2661.  dc $2f4180,$fe02c1,$0719c0,$fe6501,$00d400,$ffc701,$000c40,$000040
  2662.  dc $fffbc1,$ffd241,$ffcec1,$fdf941,$fcba41,$f75e01,$e45fc1,$b7d301
  2663.  dc $2d8640,$fd2241,$06c5c0,$fe4d41,$00c2c0,$ffc701,$000b40,$000040
  2664.  dc $fffb41,$ffd081,$ffc301,$fdf6c1,$fc61c1,$f7b501,$e29801,$b76dc1
  2665.  dc $2bc540,$fc5001,$066f40,$fe3881,$00b1c0,$ffc741,$000a40,$000040
  2666.  dc $fffac1,$ffcf01,$ffb681,$fdf641,$fc0841,$f81901,$e0cd41,$b71e81
  2667.  dc $29ff80,$fb8bc1,$061740,$fe26c1,$00a140,$ffc7c1,$000980,$000040
  2668.  dc $fffa01,$ffcd81,$ffa941,$fdf801,$fbadc1,$f88a01,$df0041,$b6e601
  2669.  dc $283600,$fad601,$05bdc0,$fe1801,$009140,$ffc881,$0008c0,$000040
  2670.  dc $fff981,$ffcc01,$ff9bc1,$fdfc41,$fb5301,$f90881,$dd3201,$b6c401
  2671.  dc $266a00,$fa2e41,$056340,$fe0c01,$0081c0,$ffc981,$0007c0,$000040
  2672. synth_tab_sinx
  2673.  dc  0.000000, 0.049068, 0.098017, 0.146730    ;sine only
  2674.  dc  0.195090, 0.242980, 0.290285, 0.336890
  2675.  dc  0.382683, 0.427555, 0.471397, 0.514103
  2676.  dc  0.555570, 0.595699, 0.634393, 0.671559
  2677.  dc  0.707107, 0.740951, 0.773010, 0.803208
  2678.  dc  0.831470, 0.857729, 0.881921, 0.903989
  2679.  dc  0.923880, 0.941544, 0.956940, 0.970031
  2680.  dc  0.980785, 0.989177, 0.995185, 0.998795
  2681. synth_tab_cosx
  2682.  dc  0.999999, 0.998795, 0.995185, 0.989177    ;sine and cosine
  2683.  dc  0.980785, 0.970031, 0.956940, 0.941544
  2684.  dc  0.923880, 0.903989, 0.881921, 0.857729
  2685.  dc  0.831470, 0.803208, 0.773010, 0.740951
  2686.  dc  0.707107, 0.671559, 0.634393, 0.595699
  2687.  dc  0.555570, 0.514103, 0.471397, 0.427555
  2688.  dc  0.382683, 0.336890, 0.290285, 0.242980
  2689.  dc  0.195090, 0.146730, 0.098017, 0.049068
  2690.  dc  0.000000,-0.049068,-0.098017,-0.146730    ;cosine only
  2691.  dc -0.195090,-0.242980,-0.290285,-0.336890
  2692.  dc -0.382683,-0.427555,-0.471397,-0.514103
  2693.  dc -0.555570,-0.595699,-0.634393,-0.671559
  2694.  dc -0.707107,-0.740951,-0.773010,-0.803208
  2695.  dc -0.831470,-0.857729,-0.881921,-0.903989
  2696.  dc -0.923880,-0.941544,-0.956940,-0.970031
  2697.  dc -0.980785,-0.989177,-0.995185,-0.998795
  2698.  
  2699.  
  2700.  
  2701.  
  2702.  
  2703.  
  2704.  
  2705.  
  2706.  
  2707.     org    l:
  2708.     align    64
  2709. synth_imfct_slow
  2710.     ds    64
  2711.  
  2712. synth_tab_rsinxrcosx
  2713. ;    **    x:rsinx        y:rcosx
  2714.     dcl    0.000000,     0.999999
  2715.     dcl    0.999999,     0.000000
  2716.     dcl    0.707107,     0.707107
  2717.     dcl    0.707107,    -0.707107
  2718.     dcl    0.382683,     0.923880
  2719.     dcl    0.923880,    -0.382683
  2720.     dcl    0.923880,     0.382683
  2721.     dcl    0.382683,    -0.923880
  2722.     dcl    0.195090,     0.980785
  2723.     dcl    0.980785,    -0.195090
  2724.     dcl    0.831470,     0.555570
  2725.     dcl    0.555570,    -0.831470
  2726.     dcl    0.555570,     0.831470
  2727.     dcl    0.831470,    -0.555570
  2728.     dcl    0.980785,     0.195090
  2729.     dcl    0.195090,    -0.980785
  2730.     dcl    0.098017,     0.995185
  2731.     dcl    0.995185,    -0.098017
  2732.     dcl    0.773010,     0.634393
  2733.     dcl    0.634393,    -0.773010
  2734.     dcl    0.471397,     0.881921
  2735.     dcl    0.881921,    -0.471397
  2736.     dcl    0.956940,     0.290285
  2737.     dcl    0.290285,    -0.956940
  2738.     dcl    0.290285,     0.956940
  2739.     dcl    0.956940,    -0.290285
  2740.     dcl    0.881921,     0.471397
  2741.     dcl    0.471397,    -0.881921
  2742.     dcl    0.634393,     0.773010
  2743.     dcl    0.773010,    -0.634393
  2744.     dcl    0.995185,     0.098017
  2745.     dcl    0.098017,    -0.995185
  2746.  
  2747.  
  2748. ktab
  2749. ;    X: - left        Y: - right
  2750.     dcl    0.000000,    0.999999    ;0
  2751.     dcl    0.211325,    0.788675    ;1
  2752.     dcl    0.366025,    0.633975    ;2
  2753.     dcl    0.500000,    0.500000    ;3
  2754.     dcl    0.633975,    0.366025    ;4
  2755.     dcl    0.788675,    0.211325    ;5
  2756.     dcl    0.999999,    0.000000    ;6
  2757.     dcl    0,        0        ;7 (SKIP)  1.3660254, -0.3660254
  2758. ;end of 3bit-distance
  2759.     dcl    0,        0        ;8   2.3660254, -1.3660254
  2760.     dcl    0,        0        ;9   NaN (undefined)
  2761.     dcl    0,        0        ;10  -1.3660254, 2.3660254
  2762.     dcl    0,        0        ;11  -0.3660254, 1.3660254
  2763.     dcl    0.000000,    0.999999    ;12
  2764.     dcl    0.211325,    0.788675    ;13
  2765.     dcl    0.366025,    0.633975    ;14
  2766.     dcl    0.500000,    0.500000    ;15
  2767. ;end of 4bit-distance
  2768.  
  2769.  
  2770. ;the end
  2771.